繁体   English   中英

如何将Raw Socket绑定到特定端口?

[英]How to bind a Raw Socket to a specific port?

我目前正在从事编程工作。 分配是实现客户端,网络仿真器和服务器。 客户端将数据包传递给网络仿真器,网络仿真器传递给服务器。 反之亦然。 分配的先决条件是我只能使用原始套接字。 所以我将创建自己的IP和UDP标头。 我用wireshark测试了我的数据包。 它们都是正确的并且格式正确(它可以正确读取)。

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

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

感谢您的时间。

-

raw(7)手册页说:

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

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

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

我想你的项目预计会或多或少地模仿这个过程。 显然,它没有一个像在内核中那样高效,但由于分配是在用户空间中写入(部分)IP栈,我认为效率不是练习的重点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM