. net套接字web服务器HTTP POST请求体

本文关键字:POST 请求 HTTP 服务器 套接字 web net | 更新日期: 2023-09-27 18:04:57

我正在做一个c#嵌入式项目,我已经写了一个基于套接字的web服务器。一切都很顺利,除了我这辈子都得不到请求的身体。Content-Length表示有12个字符,但是套接字。receive方法只获取头。

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个字符)

我在这里错过了什么?正文是由多个部分组成的表单数据

. net套接字web服务器HTTP POST请求体

int bytesReceived = (availableBytes > maxRequestSize ? maxRequestSize : availableBytes);

如果maxRequestSize是487,那么你将得到你所描述的结果。

还要记住Content-Length不是字节-它是八位字节:什么'字段在HTTP头?(好吧,我有点迂腐-八位是8位;))

我想知道Available属性是多么可靠。看起来它只对非阻塞套接字有用,然后只作为一个布尔标志,表示某些可用。

为什么不直接在循环中读取流解析消息呢?