2011-10-14 79 views
0

我使用pidgin,A,B和C运行多个bonjour客户端。
当B和C对话时,我发现A使用相同的端口(使用wireshark我可以看到数据包) MDNS和通信,
但B和C,每一个具有两个不同的端口一个用于MDNS,一个用于套接字连接。
A如何工作,为什么它只能用一个端口工作?一个端口如何提供多个连接?
注意:如果是多线程,那么当它接受它会创建另一个自由港新的套接字连接,但我看到Wireshark的数据包,客户端A所做的仅仅是使用相同的端口进行通信和MDNS。 (source_address,source_port,的destination_address,destination_port):
一个端口上的多个连接

回答

5

TCP连接实际上是由元组来标识。所以只要其中一个不同就没有问题了。

在实践中,你说会发生什么,当一个程序监听在给定的端口的连接:任何新的连接使用相同的服务器端口(但不同的客户地址或端口)创建的。

对于exmample,在我的Linux机器,在那里我有一个Web服务器侦听端口80:

$ telnet localhost 80 & 
$ telnet localhost 80 & 
$ lsof -n -i TCP 
... 
TCP 127.0.0.1:45601->127.0.0.1:80 
TCP 127.0.0.1:45602->127.0.0.1:80 
+0

感谢,但是当我尝试使用端口5298连接到在同一台机器上其他几个端口, java套接字,有“地址已被使用”的异常?你说如果元组中的任何元素发生变化,它应该没问题,这怎么会发生?那么我尝试了另一个指定的本地端口5555,我有“连接被拒绝”?我们不能指定本地端口吗?还是应该在创建套接字之前对本地指定的端口执行一些操作?我尝试在IPTABLE中禁用此端口,但它不起作用! – seaguest

+3

好吧,我说如果元组中有元素发生变化,那么TCP协议就没关系了。但套接字API有其他的限制:你不能绑定到同一个本地地址/端口不止一次(除非你设置SO_REUSEADDR选项,但这有其他更微妙的影响)。因此“地址已被使用”错误。当您尝试连接到目标地址/端口并且该端口中没有监听时,会发生“连接被拒绝”错误。 – rodrigo

+0

非常感谢您的回答!事实上我解决了这个问题,因为我不知道MDNS使用默认端口5353,并且我配置了一个用于socket的错误端口。所以现在它工作得很好!再次感谢您的热烈回答! – seaguest

相关问题