Ситуация
Мы используем следующий код для приема входящих 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);
}
}
Почему бы не просто позвонить Читать и блокировать ли данные до тех пор, пока данные не будут доступны? –
Не знаю. Что означает «Доступно» в этом случае? –