【发布时间】:2013-10-02 22:25:56
【问题描述】:
我想创建一个 IP 隧道。为此,我在客户端用 C# 创建了一个原始套接字并将其绑定到端口 4999:
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# 代码,但这不是我的问题。
【问题讨论】:
-
Berkeley Sockets 将是 C 恕我直言 gnosis.cx/publish/programming/sockets.html 的首选选项,如果您使用 C++,Boost 等库在 Berkeley 周围有更接近您发布的 C# 代码的包装器。
-
@AllanElder 查看我的编辑。