本人正在编写一个FTP服务器的更新程序,需要实现的功能是更新本地的文件
大概原理是这样的,先从服务器上下载配置文件,比较版本号,然后再下载更新文件
现在有个问题是这样的:
根据FTP的协议,通常需要编写两个Socket,一个Session,一个Data,我采用的是WSAAysncSelect模型,因此需要在主窗口建立消息循环来接消息,由于是要接两个套接字的消息,所有我定义了两个消息循环,本来应该在Session发“RETR”命令之前,调用WSAAysncSelect来启动Data消息循环,但是我的Data消息循环总是响应不到消息,而Session却直接收到“RETR"的返回码。
请高手帮助,不甚感激!

解决方案 »

  1.   

    很麻烦,WSAAysncSelect模型本身是基于窗口消息的,本身效率就低,你除非增加一个窗口来响应,可以不显示出来,建议还是用IOCP完成端口模型。FTP没搞过。
      

  2.   

    一个消息循环就够了,没必要两个呀。线程也只需要一个。
    SOCKET fdSession,fdData;
    //创建socket
    fdSession = socket(...);
    WSAAsyncSelect(fdSession,hWnd,WM_APP+1,FD_READ);//协商传输模式,假设是passive模式
    fdData = socket(...);
    WSAAsyncSelect(fdData,hWnd,WM_APP+1,FD_READ);
    bind(fdData,...);
    send(fdSession,"PORT ...");
    send(fdSession,"RETR ...");
    ...
    void OnSocketMsg(WPARAM w,LPARAM l)
    {
        //处理WM_APP+1的消息
        SOCKET s;
        DWORD events;
        s = msg.wParam;
        events = (uint32_t)(msg.lParam & 0xffff);
        if(s==fdSession)
        {
          //这是应答消息
        }
        else if(s==fdData)
        {
          //这是数据
        }
    }