c# - 套接字在 X 消息后停止接收

标签 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方法启动接收线程(如下0

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

我做错了什么?

最佳答案

好的,我想通了,所以我在这里发帖给以后可能需要它的人

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

我的问题是我的代码不是异步的,也不是足够快来清理这个缓冲区,所以最后的 TCP 数据包没有更多的缓冲区而被忽略了。

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

关于c# - 套接字在 X 消息后停止接收,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20825852/

相关文章:

c# - 在 ContinueWith() 之后,ConfigureAwait(False) 不会改变上下文

c - 使用套接字通过C中的SOCKS5代理服务器发送请求

java - TIME_WAIT 中的 Netty 连接

c# - 如何将 AutoMapper 与 Ninject.Web.Mvc 一起使用?

.net - 不会在表单加载时触发的 SelectedIndexChanged 替代方案?

c# - 从 If 语句返回 Int

c# - 将 XML 字符串反序列化为对象错误 : There is an Error in xml document (1, 2)

c# - 非常奇怪的问题通过 C# 中的套接字发送数据

c# - 带有卡住标题和列的水平和垂直 GridView

c# - 为什么我的自定义 OnLoaded 事件会收到 "Object reference not set to an instance of an object"?