如题!!!!
为什么主线程需要加上RECV呢?当有消息来了以后直接在服务线程中接收不行吗?不懂啊

解决方案 »

  1.   

    是不是先有RECV,端口才会接收其他SOCKET传过来的数据和改变信号?
      

  2.   

    LZ说的是IOCP么?如果一开始没有RECV是没法驱动IOCP工作的。
      

  3.   

    void CMyIOtestDlg::OnButton1()  
    {
    // TODO: Add your control notification handler code here
    CompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0);//创建端口
    GetSystemInfo(&SystemInfo);//获取系统信息
    for(i = 0; i<(SystemInfo.dwNumberOfProcessors); i++)
    {
    HANDLE ThreadHandle;
    ThreadHandle = CreateThread(NULL, 0,ServerWorkerThread, CompletionPort,0, NULL);//创建线程
    CloseHandle(ThreadHandle);//关闭句柄
    }
    Listen = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);//创建套接字InternetAddr.sin_family = AF_INET;
    InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    InternetAddr.sin_port = htons(9527);
    bind(Listen, (PSOCKADDR) &InternetAddr,sizeof(InternetAddr));//绑定套接字
    listen(Listen, 5);//监听套接字
    while(TRUE)
    {SOCKADDR_IN saRemote;
    SOCKET Accept;
    int RemoteLen;
    RemoteLen = sizeof(saRemote);
    Accept = WSAAccept(Listen, (SOCKADDR *)&saRemote, &RemoteLen,0,0);
    PER_HANDLE_DATA *PerHandleData=NULL;
    PerHandleData = (LPPER_HANDLE_DATA) GlobalAlloc(GPTR, sizeof(PER_HANDLE_DATA));
    PerHandleData->Socket = Accept;
    memcpy(&PerHandleData->ClientAddr, &saRemote, RemoteLen);
    if(CreateIoCompletionPort((HANDLE) Accept,CompletionPort, (DWORD) PerHandleData, 0)==NULL)
    {
    closesocket(Accept);
    }
    else
    {
    PER_IO_OPERATION_DATA *p_Data=&Data;
    memset(p_Data,0,sizeof(PER_IO_OPERATION_DATA));
    p_Data->DataBuf.buf = p_Data->szBuffer;
    ZeroMemory(p_Data->szBuffer,sizeof(p_Data->szBuffer));
    DWORD RecvBytes=0;
    DWORD Flags=0;
    int nRet =WSARecv(Accept, &(p_Data->DataBuf), 1, &RecvBytes,&Flags, &(p_Data->Overlapped), NULL);
    if(nRet == SOCKET_ERROR && (ERROR_IO_PENDING != WSAGetLastError()))
    {
    //cout << "WASRecv Failed::Reason Code::"<< WSAGetLastError() << endl;
    closesocket(Accept);
    delete p_Data;
    }
    }
    }
    return;
    }
    ------------------------------------------
    DWORD WINAPI ServerWorkerThread(LPVOID CompletionPortID)
    {
      HANDLE CompletionPort = (HANDLE) CompletionPortID;
      DWORD BytesTransferred;
      LPOVERLAPPED Overlapped;
      LPPER_HANDLE_DATA PerHandleData;
      PER_IO_OPERATION_DATA *PerIoData;
      DWORD SendBytes, RecvBytes;
      DWORD Flags;
        
      while(TRUE)
      {
      // Wait for I/O to complete on any socket
      // associated with the completion port
        
      int ret = GetQueuedCompletionStatus(CompletionPort,
      &BytesTransferred,(LPDWORD)&PerHandleData,
      (LPOVERLAPPED *) &PerIoData, INFINITE);
    CString str;
    str.Format("%d",BytesTransferred);
    AfxMessageBox(str);
    -------------------……………………………………
    为何我向服务器发东西,进入了工作线程,然而接收数据str确实0啊???????? 
     
     
      

  4.   

    ?IO端口收到信息不会自动填充BytesTransferred?
      

  5.   


    那这个p_Data->DataBuf,WSABUF总得先填好再WSARecv