可以将同一台计算机上的套接字客户端和服务器绑定到同一端口吗?

时间:2018-12-28 10:03:52

标签: linux sockets

就我而言,我需要在同一台计算机上运行套接字客户端和服务器。

udp套接字客户端需要将本地端口绑定到1234,并将与 远程服务器。 同一台计算机上的udp套接字服务器也需要将本地端口绑定到1234,并且还要与远程端的套接字客户端进行通信。

可行吗?有任何潜在的问题或通知吗? 谢谢!

5 个答案:

答案 0 :(得分:1)

如果您正在使用多播或广播UDP通信,那么将多个程序绑定到同一个UDP端口通常是有意义的,如果在调用{之前使用适当的参数调用setsockopt(),则可以这样做{1}}:

bind()

在这种情况下,端口上接收到的每个多播/广播UDP数据包的副本都将传递到绑定到该端口的每个套接字(与每个程序在单独的程序上运行时所获得的行为大致相同)机器,因此通常就是您想要的东西)

OTOH,如果仅发送单播UDP数据包(即打算发送给单个收件人的数据包),则将多个程序绑定到同一端口通常没有用,因为发送的每个UDP数据包都会被接收只是一个接收程序,并且有多个程序在侦听同一端口,因此不确定/将是哪个程序。例如,在您的情况下,您的客户端程序可能会发送一个数据包,而服务器将无法接收到该数据包,因为该数据包已被排队到客户端套接字的缓冲区中。因此,对于这种情况,最好将客户端和服务器绑定到不同的端口。 (请注意,任何接收UDP数据包的程序都可以通过调用 const int trueValue = 1; setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &trueValue, sizeof(trueValue)); #ifdef __APPLE__ setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &trueValue, sizeof(trueValue)); #endif 来接收数据包并随后查看recvfrom()参数的内容来轻松找出数据包的发送方绑定到哪个端口。 ;因此,即使客户端每次运行时都使用完全随机/任意的UDP端口,服务器也应该直接回复客户端发送给它的数据包。如果您告诉客户端address进行端口0,则网络堆栈将选择一个当前可用的UDP端口进行绑定)

答案 1 :(得分:0)

您正在使用什么?语言,框架,库...

通常,服务器在本地端口上侦听。客户端通常连接到它们,并且不会“阻止”它们。因此,从我的角度来看,应该没有问题。

答案 2 :(得分:0)

来自man nc

CLIENT/SERVER MODEL
 It is quite simple to build a very basic client/server model using nc.  On
 one console, start nc listening on a specific port for a connection.  For
 example:

       $ nc -l 1234

 nc is now listening on port 1234 for a connection.  On a second console (or a
 second machine), connect to the machine and port being listened on:

       $ nc 127.0.0.1 1234

答案 3 :(得分:0)

肯定客户端和服务器不能绑定到相同的地址。 bind()函数将返回-1,而perror()函数将显示“地址已在使用中”错误消息。但是,为什么需要客户端和服务器绑定到同一端口?通常,客户端会选择一个随机端口与服务器进行通信,或者您可以将其绑定到与服务器不同的端口。

答案 4 :(得分:0)

不,这是套接字API的局限性,并且会损害基于TCP的对等应用程序的编写。

在对等应用程序中,自然的事情是对传出和传入连接都使用单个端口。虽然TCP协议支持此模型,但套接字API不支持该模型-如果套接字正在监听端口 p ,然后将活动套接字绑定到端口 p 将失败。

显而易见的解决方法是使用临时端口进行传出连接(在活动套接字上不使用bind)。在某些情况下,这会导致其他问题,需要解决。例如,请参见BEP-10中BitTorrent扩展握手中的p参数。