У меня есть веб-сервер, получающий данные через асинхронные сокеты:
var e = new SocketAsyncEventArgs();
e.Completed += new EventHandler<SocketAsyncEventArgs>(e_Completed);
while (true)
{ allDone.Reset();
mySocket.AcceptAsync(e);
allDone.WaitOne();
}
и другой метод:
public void e_Completed(object sender, SocketAsyncEventArgs e)
{
var socket = (Socket)sender;
ThreadPool.QueueUserWorkItem(handleTcpRequest, e.AcceptSocket);
e.AcceptSocket = null;
socket.AcceptAsync(e);
}
это метод handleTcpRequest. В этой части я получаю данные из сокета и выполняю операцию:
public void handleTcpRequest(object state)
{
string sBuffer = "";
string BufferTotal = "";
byte[] secureMessage;
Byte[] bReceive = new Byte[1024];
var mySocket = (Socket)state;
do
{
try
{
firstBufferRead = mySocket.Receive(bReceive, bReceive.Length, 0);
}
catch (Exception ex)
{
Console.WriteLine("Error Occurred (:))) " + ex.Message);
}
sBuffer += Encoding.GetEncoding(1252).GetString(bReceive, 0, firstBufferRead);
BufferTotal += Encoding.UTF8.GetString(bReceive, 0, firstBufferRead);
} while (mySocket.Available != 0);
.
.
.
.
mySocket.Close();
}
что не так? иногда соединение сбрасывается и закрывается. это происходит, когда расстояние далека или данные не размножаются. но в multipart случается редко. больше с формами, не входящими в состав. когда и где следует закрывать розетку? когда я работаю с socket в методе handleTcpRequest, он является локальным. не так ли? Я не могу найти причину проблемы
Единственный способ узнать, что вы получили все в HTTP-запросе, - это понять HTTP-запрос. И для понимания HTTP-запроса у вас есть выбор:
Причина того, почему ваш код выходит из строя для многочастных данных, вероятно, потому, что другая сторона отправляет одну часть за раз, что означает, что вашему коду удается выполнить mySocket.Available != 0
до отправки остального.
Если вы хотите сделать последнее, вам нужно прочитать HTTP-заголовок (в формате headerName: headervalue
, обратите внимание, что есть также правила пробела, которые вы должны учитывать). Найдите заголовок с именем content-length
, проанализируйте его как целое число. Затем дождитесь двух строк в строке (\r\n\r\n
). Наконец, начните подсчет байтов, пока не получите количество байтов, указанное в заголовке content-length
.
ohh.. ony more thing.. молитесь Богу, что Transfer-Encoding: Chunked
не используется.
Мой совет заключается в том, что вы отказываетесь от использования сокетов напрямую, поскольку очевидно, что вы не понимаете, как они работают или как проводить исследования на них.
code
while (! SBuffer.Contains ("\ r \ n \ r \ n"));code
но все та же ошибка