一直都对ftpserver如何使用20端口没有概念。今天算是弄明白了。 20端口并不接受外来的连接请求,而是连接到客户端的源端口。 只是适用于port模式,passive模式不涉及20端口。 比如: 客户端发来请求 port 222,222,222,222, 5,199 那么就表示客户端打开了1399端口来等待服务器连接。 5->0x05 199->0x77 0x0577 = 1399 这时候服务器创建一个socket并且绑定到20端口,然后连接到222.222.222.222 : 1399 完成发送数据的工作。
示例代码: SOCKET sd; SOCKADDR_IN addr; int ret = 0;
sd = socket(AF_INET, SOCK_STREAM, 0); addr.sin_family = AF_INET; addr.sin_port = htons(20); //20作为源端口。如果这里写0,那么系统将自动分配一个1024 - 5000 之间的端口(这个范围可以通过修改注册表来调整) addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); //绑定源地址 ret = bind(sd, (sockaddr *)&addr, sizeof(addr)); addr.sin_port = htons(1399); addr.sin_addr.S_un.S_addr = inet_addr("222.222.222.222"); //当然在服务器中不需要产生字符串形式的ip地址 ret = connect(sd, (sockaddr *)&addr, sizeof(addr)); //send data..... ret = closesocket(sd);
|