如何在C#中获取原始的TCP数据包?

9

我想要接收原始TCP数据包,然后以相同的工作负载发送回去。

应该长这个样子:

void OnPacketReceived(TcpPacket p)
{
    byte [] body = p.GetBody();
}

注意:我需要TCP数据包而不是以太网帧。


我可能100% 错误,但我不确定使用托管代码是否可以做到这一点。据我所知,C#中的套接字库仅使用流,因此抽象了数据包边界。 - Brian Driscoll
2
你看过http://pcapdotnet.codeplex.com/吗?它是WinPcap的.NET封装。 - Eric Dahlvang
你需要从以太网IP帧中提取TCP数据包信息。 - pylover
你想做什么?请更详细地描述你的想法。如果你需要一个TCP服务器来处理TCP数据包并对其进行响应,你需要在Win32、C++、MFC和COM组件方面有一些经验。但是还有另一个简单的解决方案:Win32 Tun/Tap。 - pylover
2
此外,您应该知道TCP处理通常是在硬件中完成的吧?使用内置的.NET TCP实现可能是您可以做的最快的事情,因为它本质上只是对本地win32库的包装器。我不明白可能有什么延迟敏感的东西,可以使用C#但不能使用内置的TCP套接字功能。您是要优化到CPU周期吗?如果是这种情况,请不要在C#中执行此操作。 - dodexahedron
显示剩余8条评论
3个回答

7
如果您将套接字实现为原始套接字,则可以访问整个数据包(实际上必须自己处理有关数据包的所有内容)。
在创建套接字时,请使用SocketType.Raw和ProtocolType.Raw。
只需注意,如果以这种方式实现套接字,则需要处理TCP的详细信息。
以下是有关Socket类的MSDN文档的参考链接: http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx

+1:我曾使用该方法来检查TCP数据包头部是否具有校验和(因为它不是强制性的)。 - Allon Guralnek
@AllonGuralnek,你能分享一下代码吗?或者至少概述一下需要做什么才能实现这个功能吗? - Boppity Bop
@dodexahedron - 你确定如果我连接原始套接字,就可以直接访问TCP数据包吗?(这是实际问题)。如果你确定,请确认一下,我会将其标记为答案。谢谢。 - Boppity Bop
是的。请注意,在.NET中以这种方式打开套接字需要管理员权限(必须在Vista+中以管理员身份运行应用程序),否则会出现异常。使用原始套接字时,您将可以访问整个数据包作为字节数组,而使用TCP套接字时仅能访问有效负载。 - dodexahedron
还要意识到,正如我所说的,你必须实现TCP才能使其工作。握手甚至不再由系统自动处理。 - dodexahedron

2

有用的库,感谢建议。 :) - Majid

0

你需要使用数据包嗅探器,在其中可以放置您选择的过滤器,根据其基础还可以做出响应。

.Net封装WinPcap可能对您有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接