我目前正致力于编程工作。分配是实现客户端,网络仿真器和服务器。客户端将数据包传递给网络仿真器,网络仿真器传递给服务器。反之亦然。分配的先决条件是我只能使用原始套接字。所以我将创建自己的IP和UDP标头。我用wireshark测试了我的数据包。它们都是正确的并且格式正确(它可以正确读取)。
另一个要求是模拟器,客户端和服务器都有必须绑定的特定端口。现在,我不明白如何将原始套接字绑定到特定端口。我的所有原始套接字都接收它们绑定的主机地址上的所有流量。根据手册页和互联网上的其他地方,包括理查德史蒂文斯的“Unix网络编程”,这就是他们应该如何工作的。我的老师没有回复我的任何电子邮件,我可能要到周二才能问他。我看到前面有两个选项。首先,我可以使用libpcap从特定设备进行过滤,然后输出到我的原始套接字。我觉得这超出了我们的任务范围。或者我可以在从套接字接收它们后过滤它们。这显然有很多开销,因为所有数据包都是通过内核复制/移动的。至少,这是我的理解(如果我错了,请随时纠正我。)
所以我的问题是: 他们是一个选项还是我可以为此设置的东西?原始套接字将绑定到端口的位置?我错过了一些明显的东西吗?
感谢您的时间。
-
答案 0 :(得分:3)
可以使用bind(2)调用将原始套接字绑定到特定的本地地址。如果没有绑定,则接收所有具有指定IP协议的数据包。此外,可以使用SO_BINDTODEVICE将RAW套接字绑定到特定网络设备;见socket(7)。
编辑:您无法将原始套接字绑定到特定端口,因为" port"是TCP和UDP中的概念,而不是IP。看看这三个协议的标题图,它应该变得很明显:你在较低的层次上工作,其中端口的概念是未知的。
答案 1 :(得分:1)
我认为您应该过滤软件中的数据包。听起来这个练习是通过在用户空间中重新创建它的简化部分来了解IP堆栈的不同组件。通常在内核中,IP代码将处理所有数据包,验证IP头,重新组合片段,并检查协议字段。如果协议字段是17(udp),则它将其传递给UDP代码(每个UDP数据包)。然后由UDP代码验证UDP标头,并根据目标端口确定是否有任何应用程序对它们感兴趣。
我想你的项目预计会或多或少地模仿这个过程。显然,它不会像在内核中那样高效,但由于分配是在用户空间中写入(部分)IP堆栈,我猜测效率不是练习的重点。