【发布时间】:2016-03-25 01:08:27
【问题描述】:
情况
我们使用以下代码来接受传入的 HTTP 请求。
var localEndPoint = new IPEndPoint(IPAddress.Any, Port);
var serverSocket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
serverSocket.Bind(localEndPoint);
serverSocket.Listen(backlog: 25);
while (true)
{
using (var clientSocket = serverSocket.Accept())
{
if (clientSocket.Available > 0)
{
var builder = new StringBuilder();
while (clientSocket.Available > 0)
{
var currentBytes = new byte[clientSocket.Available];
var bytesReceived = clientSocket.Receive(currentBytes);
var currentBytesString =
new string(Encoding.UTF8.GetChars(currentBytes));
builder.Append(currentBytesString);
}
}
}
}
问题
有时clientSocket.Available 为零,即使连接有数据。我们实现的解决方案是在接受连接后等待,然后再检查数据是否可用。我们这样做:
var start = DateTime.Now;
var duration = new TimeSpan(0);
while (clientSocket.Available <= 0 || duration.Milliseconds < 1000)
{
duration = DateTime.Now - start;
Thread.Sleep(100);
}
问题
接受一个连接后,我们需要等待多长时间,连接的数据才能在套接字中可用?
工作解决方案
感谢 szym 对这种方法的启发。它现在正在工作。
while (true)
{
using (var clientSocket = serverSocket.Accept())
{
var builder = new StringBuilder();
do
{
var currentBytes = new byte[50];
var bytesReceived = clientSocket.Receive(currentBytes);
var currentBytesString =
new string(Encoding.UTF8.GetChars(currentBytes));
builder.Append(currentBytesString);
}
while (clientSocket.Available > 0);
}
}
【问题讨论】:
-
为什么不直接调用 Read 让它阻塞直到数据可用?
-
我不知道。在这种情况下,
Available是什么?
标签: c# .net sockets .net-micro-framework