C 在单个端口上配置多个UDP套接字

C 在单个端口上配置多个UDP套接字,c,sockets,networking,udp,C,Sockets,Networking,Udp,我正在尝试使用UDP实现一个点对点聊天应用程序,我想知道如何将该程序扩展到多个用户 据我所知,UDP只需要一个套接字就可以使用recvfrom和sendto函数发送和接收数据。使用传递给这些函数的地址字段中的数据,我可以确定与哪个用户通信 我想知道是否可以在同一端口上为与我交谈的每个对等方创建多个UDP套接字。这样,如果数据来自对等X,那么数据将进入UDP端口,并传递到与X地址“绑定”的相应套接字 在仍然使用UDP的情况下,我是否可以这样做 是的,您可以在绑定UDP套接字(包括第一个套接字在内的

我正在尝试使用UDP实现一个点对点聊天应用程序,我想知道如何将该程序扩展到多个用户

据我所知,UDP只需要一个套接字就可以使用
recvfrom
sendto
函数发送和接收数据。使用传递给这些函数的地址字段中的数据,我可以确定与哪个用户通信

我想知道是否可以在同一端口上为与我交谈的每个对等方创建多个UDP套接字。这样,如果数据来自对等X,那么数据将进入UDP端口,并传递到与X地址“绑定”的相应套接字


在仍然使用UDP的情况下,我是否可以这样做

是的,您可以在绑定UDP套接字(包括第一个套接字在内的所有套接字)之前指定SO_REUSEADDR(Linux上的SO_REUSEPORT),然后将每个套接字连接到适当的目标,但实际上并不需要这样做。只需根据每个消息的源地址将每个消息发送到单个套接字上。

是的,您可以在绑定UDP套接字(包括第一个套接字在内的所有套接字)之前指定SO_REUSEADDR(Linux上的SO_REUSEPORT),然后将每个套接字连接到相应的目标,但实际上并不需要这样做。只需根据消息的源地址将每个消息发送到一个套接字上。

因此,使用So_REUSEPORT可以保证来自X的数据报将发送到X的套接字,来自Y的数据报将发送到Y的套接字,这两个端口实际上都在同一个端口上?不,将套接字连接到X或Y就可以做到这一点。所以_REUSEPORT允许您,呃,重用端口。所以我必须使用
连接
。。。嗯…我有点明白你的意思。。。我真正想做的是将所有这些套接字放入一个很好的select循环中,这样当它们准备好时,我就可以从每个对等方读取。我还觉得选择选项有助于超时。有什么想法,EJP先生?我已经说过了。不要这样做。使用单个插座。您可以使用读取超时。使用大量套接字没有任何好处。@ReiJinThunderKeg:是的,您可以使用
select()
循环
connect()
仅在源地址和目标地址/端口对之间建立静态关系,从而允许在UDP套接字上使用
send()
recv()
。您可以
bind()
将多个UDP套接字绑定到同一端口,然后
connect()
将它们连接到各自的对等端口,然后使用
select()
知道何时调用
recv()
。当然,当单个UDP套接字可以从多个对等方接收数据包时,这是相当冗余的,
recvfrom()
告诉您每个读取数据包的对等方。因此,使用So_REUSEPORT可以保证来自X的数据报将进入X的套接字,而来自Y的数据报将进入Y的套接字,两者实际上都在同一端口上?否,将插座连接到X或Y即可完成此操作。所以_REUSEPORT允许您,呃,重用端口。所以我必须使用
连接
。。。嗯…我有点明白你的意思。。。我真正想做的是将所有这些套接字放入一个很好的select循环中,这样当它们准备好时,我就可以从每个对等方读取。我还觉得选择选项有助于超时。有什么想法,EJP先生?我已经说过了。不要这样做。使用单个插座。您可以使用读取超时。使用大量套接字没有任何好处。@ReiJinThunderKeg:是的,您可以使用
select()
循环
connect()
仅在源地址和目标地址/端口对之间建立静态关系,从而允许在UDP套接字上使用
send()
recv()
。您可以
bind()
将多个UDP套接字绑定到同一端口,然后
connect()
将它们连接到各自的对等端口,然后使用
select()
知道何时调用
recv()
。当然,当单个UDP套接字可以从多个对等方接收数据包时,这是相当多余的,
recvfrom()
告诉您读取的每个数据包的对等方。@close voter(s)关闭它。不知道答案太宽了。@靠近的投票者请把它拿开。不知道答案太宽了。