c#获取从socket通过socket发送的表单数据有时socket关闭。为什么?

时间:2014-05-25 12:39:52

标签: c# sockets asynchronous

我有网络服务器通过异步套接字接收数据:

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方法中使用socket本地时。这不正确吗?我无法找到问题的根源

2 个答案:

答案 0 :(得分:0)

了解您已收到HTTP请求中的所有内容的唯一方法是了解HTTP请求。要了解HTTP请求,您必须选择:

  1. 使用完整的HTTP服务器
  2. 创建HTTP解析器
  3. 您的代码为多部分数据失败的原因可能是因为另一方一次发送一个部分,这意味着您的代码在发送其余部分之前设法执行mySocket.Available != 0

    如果您想要执行后者,则必须阅读HTTP标头(格式为headerName: headervalue,请注意还有必须考虑的空白规则)。搜索名为content-length的标头,将其值解析为整数。然后等待连续两行换行(\r\n\r\n)。最后开始计数字节,直到收到content-length标题中指定的字节数。

    噢......更多的事情......向上帝祈祷Transfer-Encoding: Chunked没有被使用。

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

答案 1 :(得分:0)

如果响应的标题为Connection:Close,则套接字将自动关闭。