C # получить данные формы сообщения, отправленные из браузера через сокет, иногда сокет закрывает. Почему?

1

У меня есть веб-сервер, получающий данные через асинхронные сокеты:

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, он является локальным. не так ли? Я не могу найти причину проблемы

Теги:
sockets
asynchronous

1 ответ

0
Лучший ответ

Единственный способ узнать, что вы получили все в HTTP-запросе, - это понять HTTP-запрос. И для понимания HTTP-запроса у вас есть выбор:

  1. Использовать полный HTTP-сервер
  2. Создать парсер HTTP

Причина того, почему ваш код выходит из строя для многочастных данных, вероятно, потому, что другая сторона отправляет одну часть за раз, что означает, что вашему коду удается выполнить mySocket.Available != 0 до отправки остального.

Если вы хотите сделать последнее, вам нужно прочитать HTTP-заголовок (в формате headerName: headervalue, обратите внимание, что есть также правила пробела, которые вы должны учитывать). Найдите заголовок с именем content-length, проанализируйте его как целое число. Затем дождитесь двух строк в строке (\r\n\r\n). Наконец, начните подсчет байтов, пока не получите количество байтов, указанное в заголовке content-length.

ohh.. ony more thing.. молитесь Богу, что Transfer-Encoding: Chunked не используется.

Мой совет заключается в том, что вы отказываетесь от использования сокетов напрямую, поскольку очевидно, что вы не понимаете, как они работают или как проводить исследования на них.

  • 0
    Привет, JGauffin. Я загружал ваш веб-сервер и источник давно, и это так трудно понять. Я попробую и надеюсь быть на связи больше
  • 0
    Я добавил кодовый code while (! SBuffer.Contains ("\ r \ n \ r \ n")); code но все та же ошибка
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню