.NET сокет веб-сервер HTTP POST запрос тела - PullRequest
1 голос
/ 10 августа 2011

Я делаю встраиваемый проект в C # и написал веб-сервер на основе сокетов. Все работает хорошо, за исключением того, что я не могу на всю жизнь получить тело запроса. Content-Length говорит, что есть 12 символов, но метод socket.Recieve получает только заголовки.

while (true)
{

    using (Socket clientSocket = listeningSocket.Accept())
    {
        IPEndPoint clientIP = clientSocket.RemoteEndPoint as IPEndPoint;
        Debug.Print("Received request from " + clientIP.ToString());
        var x = clientSocket.RemoteEndPoint;

        int availableBytes = clientSocket.Available;

        Debug.Print(DateTime.Now.ToString() + " " + availableBytes.ToString() + " request bytes available");

        int bytesReceived = (availableBytes > maxRequestSize ? maxRequestSize : availableBytes);
        if (bytesReceived > 0)
        {
            byte[] buffer = new byte[bytesReceived]; // Buffer probably should be larger than this.
            int readByteCount = clientSocket.Receive(buffer, bytesReceived, SocketFlags.None);

            using (Request r = new Request(clientSocket, Encoding.UTF8.GetChars(buffer)))
            {
                Debug.Print(DateTime.Now.ToString() + " " + r.URL);
                if (requestReceived != null) requestReceived(r);

            }


        }
    }
    Thread.Sleep(10);
}

availableBytes = 499

bytesReceived = 499

readByteCount = 487 (12 символов)

Что мне здесь не хватает? Тело - это составные данные формы, если это имеет какое-либо значение.

Ответы [ 2 ]

1 голос
/ 10 августа 2011
int bytesReceived = (availableBytes > maxRequestSize ? maxRequestSize : availableBytes);

Если maxRequestSize равно 487, то вы получите результаты, которые вы описываете.

Также помните, Content-Length - это не байты - это октеты: Что такое "длина содержимого"поле в заголовке HTTP? (ОК, я педантичен, а октет 8 бит;))

0 голосов
/ 10 августа 2011

Интересно, насколько надежно свойство Available. Похоже, это полезно только для неблокирующих сокетов, и только в качестве логического флага, говорящего о том, что что-то доступно.

Почему бы просто не прочитать поток в цикле парсинга сообщений по ходу дела?

...