FTP服务器如何处理来自同一端口的多个连接?

时间:2011-05-10 17:17:01

标签: linux sockets networking ftp port

问候,
如果我正确掌握FTP协议(RFC959),在默认设置的主动模式下,服务器建立从其端口20到ip / port客户端连接的数据连接。

有人可以向我解释这实际上如何与多个客户合作? (或者告诉我哪里弄错了)

更具体地说,我:

1)致电socket()
2)bind()描述符到我的ip / port 20
3)connect()客户端建立数据连接
同时在处理不同客户端的另一个线程中我试图做同样的事情 bind()电话会因为显而易见的原因而失败。

我知道你可以使用带有SO_REUSEADDR的setsockopt()让套接字绑定到同一个地址/端口,但是数据包是否正确传送?我很失落。

到目前为止,我无法找到任何关于此事的内容,所以任何帮助都会非常感激。

4 个答案:

答案 0 :(得分:4)

使用4个参数识别套接字连接 - 源IP,源端口,dest.IP和dest.port。如果是活动连接,则每个连接的第4个参数(目标端口,客户端计算机上的端口)将不同。当涉及路由器/ NAT时会出现复杂性,然后在许多情况下,活动模式不起作用。

答案 1 :(得分:0)

客户端通常不会绑定。拨打socket然后connect。将为连接分配唯一的本地端口。

在服务器上,socketbindlisten设置服务器端口。 accept返回唯一的客户端连接。

答案 2 :(得分:0)

FWIW,SO_REUSEADDR的目的不是让服务器在单个TCP端口上获得多个连接......因此TCP服务器可以在连接处于活动状态时快速重启;否则它必须等待它们超时内核的连接表。

有趣的是,UDP套接字可以断言SO_REUSEADDR以允许单播和多播应用程序在同一UDP端口上侦听。

答案 3 :(得分:0)

正如您所指出的,只要您在两个套接字上设置SO_REUSEADDR套接字选项,并且它们都没有正在侦听,那么bind()将不会失败 - 它们都可以绑定到相同的本地地址。

正确传递数据包,因为一个套接字连接到一个对等地址,另一个套接字连接到另一个。也就是说,当数据包到达时,源地址和端口以及目标地址amd端口用于确定将其发送到哪个本地套接字(如果有)。