平时我用TCP编程时, 一般都是服务器端设置一个端口, 而客户端用随机端口连接服务器,
但是在FTP协议定义中, 数据连接默认端口20是作为客户端连接, 怎么同时连接多个服务器?

解决方案 »

  1.   

    怎么没有人能帮忙? 我监视了Serv U程序, 能用20端口同时连接两个服务器
      

  2.   

    不是用20端口作为服务器, FTP协议中规定是作为客户端, 我测试过SERV U 程序能用20端口同时连接多个服务器, 网上许多FTP SERVER原码都是用多个随机端口代替20端口
      

  3.   

    没有高手能解决?有没有编过FTP SERVER程序的人?
      

  4.   

    如果不用端口20, 那就不符合FTP标准了, 并且如果很多用户同时下载文件, 就会把端口用完
      

  5.   

    20,21是监听的端口传输会新建一个socket进行
      

  6.   

    同意楼上,20是服务器的listen端口,不是客户端的。
      

  7.   

    如果没有看FTP协议, 就不要乱发表意见, 20不是listen端口, 而是客户端连接端口, 我已经测试过SERV U 和微软自带的FTP服务器
      

  8.   

    20是在FTP服务器上作为客户端口 连接FTP客户端的服务器, FTP客户端发PORT命令告诉FTP服务器连接那个端口
      

  9.   

    有人说IOCP可以一端连接多端口, 我对IOCP不熟悉, 有那位能帮我解释?
      

  10.   

    20是在FTP服务器上作为客户端口 连接FTP客户端的服务器, FTP客户端发PORT命令告诉FTP服务器连接那个端口
    -----------------------------------------------------
    请LZ释疑:
    1、FTP客户端通过21端口连接服务器。
    2、客户端发PORT命令告诉FTP服务器连接20端口
    问题:
    1、这个20端口是哪个程序的端口,客户端的,服务器程序的?
    2、服务器接到PORT命令后的处理:是连接客户端的20端口,还是在20端口监听接受客户端的连接?还是按我对LZ的描述的理解,一种匪夷所思的连接方式:服务器程序通过20端口连接客户端,即反向连接,connect不需要指定对方端口,只指定自己的端口。
      

  11.   

    我介绍一下FTP文件传送的机制, FTP文件传有主动和被动两种方式.
     
    先介绍主动方式:
    (1)客户端要下载或上传文件
    (2)客户端建立一个TCP侦听Socket
    (3)客户端发送PORT命令告诉服务器要连接的IP地址和端口, 这有个好处是可以使服务器和其他任意机器传送文件
    (4)服务端用20端口连接客户端侦听Socket
    (5)连接后传送文件
    (6)传送完后,服务器端关闭连接(20端口)
    我要问的问题是服务器这个端口怎么同时连接多个客户端的侦听Socket, 我测试过, Serv U和微软都可以同时连接现在介始被动方式:
    (1)客户端要下载或上传文件
    (2)客户端发命令PASV给服务器
    (3)服务器用随机端口(我测试Serv U, 不是20)建立侦听DataSocket, 返回端口给客户端, 等待客户端连接
    (4)客户端连接服务器DataSocket
    (5)连接成功, 传送文件
    (6)传送完文件,客户端关闭连接
      

  12.   

    传统的ftp分配TCP端口20为数据端口,但现代的FTP,基本都不遵从这一标准,数据端口都是随机分配的,用完后就关闭.
      

  13.   

    主动方式还是服务器连接客户端20端口喽?连接多个IP地址的20端口不行吗?创建n个SOCKET,connect多个IP地址的20端口是可以的啊。
      

  14.   

    ringphone讲可以连接多个端口, 连接一个服务器后, 再连接其他服务器时CAsyncSocket会报错
    你怎么连? 
    如果不用20端口, 就要考虑穿透防火墙的问题了, 很多服务器都关闭非公共端口
      

  15.   

    21端口是命令端口,传输命令和结果,例如list的结果.而20则是传输数据的端口,例如ftp传送个文件时.
      

  16.   

    在无连接套接字上接收(发送)数据的另一种方法是建立连接。听起来有些奇怪吧,但事实的确如此。无连接的套接字一旦建立,便可利用SOCKADDR参数(它被设为准备与之通信的远程接收端地址,recvfrom中获得)调用connect或WSAConnect。但事实上并没有建立连接。投入连接函数的套接字地址是与套接字关联在一起的,如此一来,才能够用Recv和WSARecv来代替recvfrom和WSARecvFrom。为什么呢?其原因是数据的始发处是已知的。如果在一次应用中,只和一个端点进行通信,便能很容易地与数据报套接字建立连接。
      

  17.   

    我用的都是自己写的SOCKET类,没用过CAsyncSocket,不知道CAsyncSocket不能连同端口的多服务器。但是多线程,每个线程创建1个SOCKET,connect多个IP地址的20端口是可以的。
    DWORD SocketThreadProc(LPVOID)
    {
       SOCKET sock = INVALID_SOCKET;
       struct sockaddr_in sin_addr;
       sin_addr.sin_family = AF_INET;
       sin_addr.sin_addr.s_addr = inet_addr("/*不同的IP地址*/");
       sin_addr.sin_port = htons((u_short)20);   if((sock = socket(AF_INET,SOCK_STREAM,0)) == INVALID_SOCKET)
       {
          //显示出错信息
          ...
       }
       else
       {
          if(connect(sock,(struct sockaddr*)&sin_addr;sizeof(sin_addr)) == SOCKET_ERROR)
          {
    int res = WSAGetLastError();
    //出错处理
          }
          ...
       }
       return 0;
    }
    connect多个服务器是成功的。
      

  18.   

    ringphone没有理解我的问题,我问的是1个IP的20端口,连接多个服务器,不是1个IP连接多个服务器的20端口,我将试试kitigesh的回答,数据报调用connect, 服务器端有没有Accept?
      

  19.   

    如果真不行,是不是要用IP协议实现TCP协议, 编个能多连接的客户端?
      

  20.   

    不好意思,这下真不懂了,通过20端口连接服务器,connect可以指定自己的端口?可以给个例子吗?学习。
      

  21.   

    create时指定20端口,不是connect时指定
      

  22.   

    我已经知道怎么解决了, 用SetSockOpt(SO_REUSEADDR)解决