大家好,我现在在写一个端口转发程序,转发数据到web服务器,相当于中转了一下数据,需要用一个socket池提高效率,但是除了问题,我在连接完服务器后同时监听了该socket的事件WSAAsyncSelect ,我测试时刚打开网页还可以 但一会 这个服务器socket就退出了,处理函数里我是判断当socket断开时重新连接的 不知为什么会断开 在单个线程里进行数据收发处理时报183错误,当文件已存在时,无法创建该文件 不太明白 请大侠们 帮帮忙

解决方案 »

  1.   

    不要使用keepalive这个选项.....
      

  2.   

    void CThreadPoolManage::GetServerSocketPool()
    {创建socket池备用
       SOCKET ServerSocket=-1; 
       if (serverSocketList.size()==0)
       {
       serverSocketStruct socketStruct;
       for(int i=0;i<MAX_THREAD;i++)
       {
              ServerSocket=ConnectHost();这是连接服务器的函数,返回socket
      socketStruct.server=ServerSocket;
      socketStruct.used=false; 
      serverSocketList.push_back(socketStruct);
              WSAAsyncSelect(ServerSocket,pDlgConfig->m_hWnd,WM_WEBSERVER_CLOSE,FD_CLOSE);监听socket的退出事件
       }
       }
    }、、线程里调用的函数,得到空闲连接 用户数据转发
    SOCKET CThreadPoolManage::GetServerSocket(int &serverSocketIndex)
    {
    while(waitingSection.Lock(10000)==0);
       SOCKET ServerSocket=-1;
       for(int j=0;j<serverSocketList.size();j++)
       {
       if (!serverSocketList[j].used)
       {
              serverSocketIndex=j;
              ServerSocket= serverSocketList[j].server;
      serverSocketList[j].used=true;
      break;
       }
       }
     waitingSection.Unlock();
       return ServerSocket;
    }nt WorkerThread::PortTransfer()
    {
    SOCKET ServerSock;
    //先连接到目标计算机的服务
    ServerSock =threadPool->GetServerSocket(this->socketIndex);
    // ServerSock=threadPool->ConnectHost();
    socket池这样做的,一开始先创建若干个,并置为闲 当有客户请求时就取出来,并置为忙,当socket收到FD_CLOSE消息时就重新连接下放入 socket池如果我在这个线程函数里 直接调用ServerSock=threadPool->ConnectHost();的话 而不是从socket池就不会有问题。
      

  3.   

    keepalive是什么意思,能给说清楚么,刚接触这个 代码怎么设置?谢谢
      

  4.   

    纠正一下,我刚才试了一下,直接调用ServerSock=threadPool->ConnectHost();的话 而不是从socket池,在ConnectHost函数里也设置下WSAAsyncSelect,socket也会退出,触发处理函数