问候,
如果我正确掌握FTP协议(RFC959),在默认设置的主动模式下,服务器建立从其端口20到ip / port客户端连接的数据连接。
有人可以向我解释这实际上如何与多个客户合作? (或者告诉我哪里弄错了)
更具体地说,我:
1)致电socket()
2)bind()
描述符到我的ip / port 20
3)connect()
客户端建立数据连接
同时在处理不同客户端的另一个线程中我试图做同样的事情
bind()
电话会因为显而易见的原因而失败。
我知道你可以使用带有SO_REUSEADDR的setsockopt()让套接字绑定到同一个地址/端口,但是数据包是否正确传送?我很失落。
到目前为止,我无法找到任何关于此事的内容,所以任何帮助都会非常感激。
答案 0 :(得分:4)
使用4个参数识别套接字连接 - 源IP,源端口,dest.IP和dest.port。如果是活动连接,则每个连接的第4个参数(目标端口,客户端计算机上的端口)将不同。当涉及路由器/ NAT时会出现复杂性,然后在许多情况下,活动模式不起作用。
答案 1 :(得分:0)
客户端通常不会绑定。拨打socket
然后connect
。将为连接分配唯一的本地端口。
在服务器上,socket
,bind
和listen
设置服务器端口。 accept
返回唯一的客户端连接。
答案 2 :(得分:0)
FWIW,SO_REUSEADDR
的目的不是让服务器在单个TCP端口上获得多个连接......因此TCP服务器可以在连接处于活动状态时快速重启;否则它必须等待它们超时内核的连接表。
有趣的是,UDP套接字可以断言SO_REUSEADDR
以允许单播和多播应用程序在同一UDP端口上侦听。
答案 3 :(得分:0)
正如您所指出的,只要您在两个套接字上设置SO_REUSEADDR
套接字选项,并且它们都没有正在侦听,那么bind()
将不会失败 - 它们都可以绑定到相同的本地地址。
正确传递数据包,因为一个套接字连接到一个对等地址,另一个套接字连接到另一个。也就是说,当数据包到达时,源地址和端口以及目标地址amd端口用于确定将其发送到哪个本地套接字(如果有)。