我有一个 .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/