插件在X消息后停止接收

时间:2013-12-29 13:58:40

标签: c# .net sockets http tcp

我有一个.NET Socket,可以监听计算机上的所有TCP请求,并将它们聚合成HTTP请求(如果可能)。

我有以下问题 - 当我访问一个站点(例如 - stackoverflow.com)时,我在WireShark中看到有从站点主机收到的X(比如说12个)TCP数据包。 但是在我的代码中,Socket只是在结束之前(在10条消息之后)停止接收消息

我不知道如何解决这个问题,我希望这是限制套接字的定义

这是我的代码:

public void StartCapturing()
    {
        try
        {
            _chosenOutgoingAddress = UserChoosesIpCtrl();

            _socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw,
                                 ProtocolType.IP);
            _socket.Bind(new IPEndPoint(_chosenOutgoingAddress, 0));
            _socket.SetSocketOption(SocketOptionLevel.IP, 
                                    SocketOptionName.HeaderIncluded, true);
            _socket.IOControl(IOControlCode.ReceiveAll, _bIn, _bOut);

            thrStartCapturing = new Thread(StartReceiving);
            thrStartCapturing.Name = "Capture Thread";
            thrStartCapturing.Start();
        }
        catch (Exception ex)
        {
            //TODO: general exception handler
            throw ex;
        }
    }

StartCapturing方法将启动Socket并使用StartReceiving方法启动接收线程(如下所示

private void StartReceiving()
    {
        while (!_stopCapturing)
        {
            int size = _socket.ReceiveBufferSize;
            int bytesReceived = _socket.Receive(_bBuffer,
                                                0, 
                                                _bBuffer.Length, 
                                                SocketFlags.None);

            if (bytesReceived > 0)
            {
                _decPackagesReceived++;
                ConvertReceivedData(_bBuffer, bytesReceived);
            }
            Array.Clear(_bBuffer, 0, _bBuffer.Length);
        }
    }

我做错了什么?

1 个答案:

答案 0 :(得分:1)

好的,我想通了,所以我在这里张贴给其他可能需要它的人

.NET Socket类有一个属性ReceiveBufferSize,它决定了Socket允许的缓冲区。

我的问题是我的代码不是ASync,或者足够快以清理此缓冲区,因此最后的TCP数据包没有更多缓冲区而被忽略。

增加ReceiveBufferSize或使我的代码ASync(可能更好:-))将解决此问题。