我想使用C中的原始套接字建立一个聊天室。我有以下问题:

问1:如果使用原始套接字,是否可以使用select函数处理多个连接?

问题2:套接字中的端口号是真实端口,还是为传输层上的各种应用程序逻辑实现的?

问题3:我只有一台计算机,因此使用lo(本地循环)作为界面。 因此,发起聊天的过程首先发送然后接收呼叫,因此它正在接收自己的数据。 如何限制呢?

任何帮助将不胜感激,因为这将帮助我增加对原始套接字的信心。

谢谢 :)

===============>>#1 票数:5 已采纳

如果您希望这是一个真实的可用聊天系统,请停止 不要使用原始套接字。 巨大的错误。

如果您只是想在简历的“体验”部分下放置“原始套接字”,那么您可以继续阅读。

  1. 您可以使用select函数来检测原始套接字何时有可接收的数据包,以及何时可以接受要传输的数据包。 您可以将多个文件描述符传递给单个调用,以select是否要同时检查多个原始套接字(或其他)。

  2. 端口号是TCP和UDP协议(和某些其他传输层协议)的一部分。 接收原始套接字的数据包时,内核不查找端口号。

  3. raw(7)手册页 ,指出:

    与原始套接字指定的协议号匹配的所有数据包或错误都将传递到此套接字。

    它还指出:

    可以使用bind(2)调用将原始套接字绑定到特定的本地地址。 如果未绑定,则将接收所有具有指定IP协议的数据包。

    因此,您可能希望至少对“连接”的每一端使用不同的IP地址,并将每一端绑定到其地址。

    “但是!”您说,“我正在使用环回! 我只能使用127.0.0.1地址!”朋友,不是。 整个127.0.0.0/8地址块被保留用于回送地址。 127.0.0.1仅仅是最常用的回送地址。 Linux(但可能不是其他系统)对回送块中的每个地址作出响应。 在一个窗口中尝试:

     nc -v -l 10150 

    然后在另一个窗口中:

     nc -s 127.0.0.1 127.0.0.2 10150 

    您将看到已经创建了从127.0.0.1到127.0.0.2的TCP连接。 我认为您也可以将原始套接字绑定到单独的地址。 然后,当您收到一个数据包时,可以检查它是否来自另一端的IP地址,以决定是处理还是丢弃它。

===============>>#2 票数:2

只是好奇,为什么要使用原始套接字? 原始套接字( AF_INETSOCK_RAW )允许您发送“原始”数据包,您可以在其中负责制作MAC和IP层以外的所有内容。

A1:没有与原始套接字的“连接”。 只是包。

A2:没有带有原始套接字的“端口”。 只是包。 我们所知道的“端口号”是TCP或UDP协议的一部分,两者均高于我们使用原始套接字的级别。

A3:这不是特定于原始套接字-无论您选择哪种协议,都会出现此问题。 要真正回答这个问题,我们需要了解有关您提议的协议的更多信息,因为现在您只是爆破原始IP数据包。

  ask by user3542109 translate from so

未解决问题?本站智能推荐: