c#通过socket获取浏览器发送的post表单数据,有时socket会关闭

本文关键字:socket 数据 有时 表单 获取 通过 浏览器 post | 更新日期: 2023-09-27 18:05:07

我有webserver接收数据异步套接字:

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方法。在这一部分中,我从socket接收数据并执行操作:

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();
}

什么错了吗?有时连接复位并关闭。这种情况发生在距离较远或发布的数据不是多部分的情况下。但在多部分很少发生。更多的形式不是多部分的。我应该在何时何地关闭插座?当我在handleTcpRequest方法中使用套接字时,它是本地的。这不是正确的吗?我找不到问题的根源

c#通过socket获取浏览器发送的post表单数据,有时socket会关闭

要知道您已经接收了HTTP请求中的所有内容,唯一的方法是理解HTTP请求。要理解HTTP请求,你必须选择:

  1. 使用完整HTTP服务器
  2. 创建HTTP解析器

你的代码对于多部分数据失败的原因可能是因为另一方一次发送一部分,这意味着你的代码在发送其余部分之前成功地完成了mySocket.Available != 0

如果你想做后者,你必须读取HTTP头(格式headerName: headervalue,请注意,也有空白规则,你必须考虑)。搜索标题名为content-length,解析它的值作为一个整数。然后等待两行换行('r'n'r'n)。最后开始计算字节数,直到您收到content-length头中指定的字节数。

哦. .还有一点……祈祷上帝不要使用Transfer-Encoding: Chunked

我的建议是你放弃直接使用套接字,因为很明显你不了解它们是如何工作的,也不知道如何对它们进行研究。

如果响应头为Connection: Close,则socket自动关闭。