2011-02-14 195 views
5

我目前正在进行一项编程任务。这项任务是为了实现客户端,网络仿真器和服务器。客户端将数据包传递给网络模拟器,并将网络模拟器传递给服务器。反之亦然。这项任务的先决条件是我只能使用原始套接字。所以我将创建自己的IP和UDP标头。我用wireshark测试了我的数据包。它们都是正确的,并且格式正确(正确读取它们)。如何将原始套接字绑定到特定的端口?

另一个要求是模拟器,客户端和服务器都有它们必须绑定的特定端口。现在,我不明白如何将原始套接字绑定到特定端口。我所有的原始套接字都会接收它们绑定的主机地址上的所有流量。根据手册页和互联网上的其他地方,包括理查德史蒂文斯的“Unix网络编程”,这就是他们应该如何工作。我的老师没有回复我的任何电子邮件,我可能直到星期二才能问他。我看到两个选项在我面前。首先,我可以使用libpcap从特定设备进行过滤,然后输出到我的原始套接字。尽管如此,我觉得这已经超出了我们任务的范围。或者我可以在从插座接收它们后对其进行过滤。这显然有很多开销,因为所有的数据包都被复制/移动通过内核。至少,这是我的理解(如果我错了,请随时纠正我)。

所以我的问题是: 是他们的选择或我可以为此设置?原始套接字将绑定到端口的位置?我错过了明显的东西吗?

谢谢你的时间。

-

回答

3

man page for raw(7)说:

原始套接字可以绑定到使用bind(2)调用的特定本地地址。如果未绑定,则收到所有具有指定IP协议的数据包。另外,可以使用SO_BINDTODEVICE将RAW套接字绑定到特定的网络设备;见插座(7)。

编辑:您不能将原始套接字绑定到特定端口,因为“端口”是TCP和UDP中的一个概念,而不是IP。看看这三个协议的头部图,它应该变得很明显:你正在一个较低的层次上工作,在那里端口的概念是未知的。

+0

因此,为了确保我正确解释这一点,我无法绑定到特定的端口?如果是这样的话,你将如何实施“过滤器”? Libpcap连接到特定的设备并过滤端口,或者因为这只是一个分配,只需在套接字接收后将其过滤出来?或者你是否有更好的方法来实现?顺便谢谢你的回复和时间。 – user614885 2011-02-14 02:48:26

1

我想你应该过滤软件中的数据包。听起来好像练习是通过在用户空间中重新创建简化的一部分来了解IP堆栈的不同组件。通常在内核中,IP代码将处理所有数据包,验证IP头,重新组装片段并检查协议字段。如果协议字段是17(udp),则它将它传递给UDP代码(每个UDP数据包)。这取决于UDP代码,然后验证UDP头并根据目标端口确定是否有应用程序对其感兴趣。

我想你的项目或多或少模仿这个过程。显然,它们在内核中的效率都不如内核,但是由于分配是在用户空间中编写(部分)IP栈,所以我认为效率不是练习的重点。

相关问题