我有一个.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);
}
}
我做错了什么?
答案 0 :(得分:1)
好的,我想通了,所以我在这里张贴给其他可能需要它的人
.NET Socket类有一个属性ReceiveBufferSize
,它决定了Socket允许的缓冲区。
我的问题是我的代码不是ASync,或者足够快以清理此缓冲区,因此最后的TCP数据包没有更多缓冲区而被忽略。
增加ReceiveBufferSize
或使我的代码ASync(可能更好:-))将解决此问题。