我想创建一个IP隧道。对于这一点,我在客户端上创建C#中的原始套接字并将其绑定到端口4999:在原始linux套接字上接收来自任何协议的数据包
Socket mysock = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
mysock.Bind(new IPEndPoint(IPAddress.Loopback, 4999));
mysock.Connect(new IPEndPoint(IPAddress.Loopback, 4999));
现在我可以叫mysock.Receive(byte[])
,我得到的所有IP数据包,包括IP报头。例如,如果我尝试打开一个到127.0.0.1:4999
的TCP连接,则C#应用程序将捕获3个数据包。我也可以通过这个套接字发送数据包,它会工作得很好。
然后C#应用程序将这些数据包传输到运行在Linux机器上的C++应用程序。在那里,我改变了发送端口(这是简单的部分,只是将它写入TCP头部),然后我想简单地发送它,并为我完成一切,就像它在C#中工作一样。显然,我还想接收来自原始Linux套接字的数据包,因此我可以将它们传回C#应用程序并获得一些通信。
我已经实施了除了原始的linux套接字以外的所有东西。 这是我的问题:如何在C/C++ for linux中编写上述C#代码?根据raw(7),如果我只是做socket(AF_INET, SOCK_RAW, IPPROTO_RAW)
,我不会得到TCP或UDP数据包,对不对?
编辑:顺便说一下,我在Windows上运行C#代码,但那不是我的问题。
如果您使用的是C++,像Boost这样的库,Berkeley套接字将成为CIMHO的首选选项,其中包含更接近C#代码的Berkeley封装你发布了。 –
@AllanElder看我的编辑。 –