【问题标题】:.NET socket webserver HTTP POST request body.NET 套接字网络服务器 HTTP POST 请求正文
【发布时间】:2011-08-10 13:25:42
【问题描述】:

我正在用 C# 做一个嵌入式项目,并且我已经编写了一个基于套接字的 Web 服务器。一切都很好,除了我一生都无法获得请求正文。 Content-Length 表示有 12 个字符,但是 socket.Recieve 方法只获取 headers。

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

我在这里缺少什么?正文是多部分表单数据,如果这有什么不同的话。

【问题讨论】:

  • 就调查而言,如果使用 SocketFlags.Peek 会得到不同的 readByteCount 吗?
  • @Russ 我已经尝试了所有套接字标志。没有运气。
  • 您可能想使用我的嵌入式 Web 服务器:webserver.codeplex.com。它是免费的,使用 C# 编码
  • @jgauffin 可以在 .net 微框架上使用吗?

标签: c# http sockets embedded


【解决方案1】:
int bytesReceived = (availableBytes > maxRequestSize ? maxRequestSize : availableBytes);

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

还要记住 Content-Length 不是字节 - 它是八位字节:What's the "Content-Length" field in HTTP header?(好吧,我很迂腐 - 八位字节是 8 位;))

【讨论】:

  • MaxRequestSize 是 1000,我知道你在说什么长度...但是字节没有进来...
  • 顺便问一下,你为什么要使用 OutOfBand 标志?
【解决方案2】:

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

为什么不只是在循环中读取流来解析消息呢?

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 2016-07-22
  • 2022-07-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多