Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sockets FTP主动模式和多路复用_Sockets_Ftp_Rfc - Fatal编程技术网

Sockets FTP主动模式和多路复用

Sockets FTP主动模式和多路复用,sockets,ftp,rfc,Sockets,Ftp,Rfc,FTP指定服务器打开从端口20(默认)到客户端中随机端口的数据连接,服务器通过端口h1、h2、h3、h4、p1、p2命令知道该数据连接。这称为主动模式传输 因此,主机是h1.h2.h3.h4,而端口是p1*256+p2 我的问题是:服务器如何通过默认为20的同一端口初始化到多个客户端的多个连接 假设客户端c1与服务器数据端口20建立了连接,正在传输数据,如果TCP连接已经使用了数据端口,客户端如何与服务器建立连接?实现Berkeley套接字的服务器在接受连接时要经历几个阶段。很多管道通常由框架或

FTP指定服务器打开从端口
20
(默认)到客户端中随机端口的数据连接,服务器通过
端口h1、h2、h3、h4、p1、p2
命令知道该数据连接。这称为主动模式传输

因此,主机是
h1.h2.h3.h4
,而端口是
p1*256+p2

我的问题是:服务器如何通过默认为
20
的同一端口初始化到多个客户端的多个连接


假设客户端
c1
与服务器数据端口
20
建立了连接,正在传输数据,如果TCP连接已经使用了数据端口,客户端如何与服务器建立连接?

实现Berkeley套接字的服务器在接受连接时要经历几个阶段。很多管道通常由框架或操作系统处理,我将试着指出它们。我将尝试在下面用一些伪代码解释这一点

1:绑定到侦听端口 服务器首先要求内核绑定到特定端口以开始侦听:

void* socket = bind(20);
2:接受连接 这可能是造成一些误解的原因。服务器通过绑定的套接字获得连接,但它不使用侦听端口(20)来处理与新客户端的通信,而是从内核请求一个新(随机)端口用于新的套接字连接。这通常由操作系统处理

void* clientSocket;

// Block until a client connects. When it does,
// use 'clientSocket' (a new socket) to handle the new client.
socket->accept(clientSocket);

// We'll use 'clientSocket' to communicate with the client.
clientSocket.send(someBuffer, ...);

// 'socket' is free again to accept more connections,
// so we can do it again:
void* clientSocket2;
socket->accept(clientSocket2);

// Of course, this is typically done in a loop that processes new connections all the time.
总之,侦听器套接字(20)仅用于接受新连接。客户端建立连接后,将创建一个新套接字来处理该特定连接

您可以通过检查在建立连接后作为客户端获得的套接字连接来测试这一点。您将看到远程端口不再是20(它将是远程服务器选择的随机端口)

所有这些都由tcp、ftp和任何使用套接字协议的协议共享