Accept = WSAAccept(m_Listen, NULL, NULL, NULL, 0)) == SOCKET_ERROR
主线程是不是会停在这儿直到有连接请求才会有响应啊?那没有连接的时候我的界面就象死了机一样有什么办法让它处理消息吗?

解决方案 »

  1.   

    你把这个放在线程里就ok了DWORD WINAPI TcpServerSocketThread(LPVOID lpParam)
    {   unsigned long RecvBytes=0,Flags = 0;   
       Socket  aSocket; //,*paSocket
       //int port=*((int *)lpParam );
       int port=1981;   //step 4 准备socket侦听
       sTcpServer=socket(AF_INET,SOCK_STREAM,0);
       Localaddr.sin_family=AF_INET;
       Localaddr.sin_addr.s_addr = inet_addr("192.168.168.105");//INADDR_ANY;// //htonl(INADDR_ANY);
       Localaddr.sin_port=htons(port); 
       bind(sTcpServer,(SOCKADDR *)&Localaddr,sizeof(Localaddr));   listen(sTcpServer,MaxClientCount);   while(bContinue)
       {
    sAccept=WSAAccept(sTcpServer,NULL,NULL,NULL,0); //添加socket列表
    aSocket.SocketVar=(int)sAccept;
    if (0!=addsocket(aSocket.SocketVar))
     { 
    //释放 单句柄结构 
    //GlobalFree(PerHandleData);
    //GlobalFree(PerIoData);
    closesocket(sAccept); 
    continue;
    } PerHandleData=(LPPER_HANDLE_DATA)GlobalAlloc(GPTR,sizeof(PER_HANDLE_DATA));
    //创建一个单句柄结构

    //printf("Socket number %d connected\n",sAccept);
    PerHandleData->Socket =sAccept;
    //把accept socket信息放到单句柄信息中 CreateIoCompletionPort((HANDLE)sAccept,hCICP,(DWORD)PerHandleData,0);
    //把这个单句柄结构 与 accept socket 关联起来 PerIoData = (LPPER_IO_OPERATION_DATA)GlobalAlloc(GPTR,sizeof(PER_IO_OPERATION_DATA));
        ZeroMemory(&(PerIoData->Overlapped), sizeof(OVERLAPPED));
        PerIoData->BytesSEND = 0;
        PerIoData->BytesRECV = 0;
        PerIoData->DataBuf.len = DATA_BUFSIZE;
        PerIoData->DataBuf.buf = PerIoData->Buffer;
    PerIoData->OperationType = RECV_POSTED;
     
        if (WSARecv(sAccept, &(PerIoData->DataBuf), 1, &RecvBytes, &Flags,&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
        {
          if (WSAGetLastError() != ERROR_IO_PENDING)
          {
            // socket deal
    // printf("WSARecv() failed with error %d\n", WSAGetLastError());
          }
        }
       }   return 0;
       
    }