DWORD WINAPI CompletionPortWorker(LPVOID lpvParam)
{
    HANDLE                  hCompletionPort = (HANDLE)lpvParam;
    LPPER_HANDLE_DATA       lpPerHandleData = NULL;
    LPPER_IO_HANDLE_DATA    lpPerIOHandleData = NULL;
    DWORD                   dwBytesTransferred ,dwFlags ,dwRecvs ,dwSends;
 
 
    //WaitForSingleObject(hEvent ,INFINITE);
    printf("工作者线程开始运行\n");
    while(TRUE)
    {
        GetQueuedCompletionStatus(hCompletionPort ,
                               &dwBytesTransferred ,
                               (LPDWORD)lpPerHandleData ,
                               (LPOVERLAPPED *)&lpPerIOHandleData ,INFINITE);
 
        if((dwBytesTransferred == 0 &&
            (lpPerIOHandleData->dwFlagsOp == RECV_POSTED ||
            lpPerIOHandleData->dwFlagsOp == SEND_POSTED)) ||
            lpPerHandleData == NULL)
        {
            printf("Error : In CompletionFunction : %d\n" ,WSAGetLastError());
            closesocket(lpPerHandleData->sAccept);
            GlobalFree(lpPerHandleData);
            GlobalFree(lpPerIOHandleData);
            return 0;
        }
        if(lpPerIOHandleData->dwFlagsOp == RECV_POSTED)
        {
            printf("收到数据正在处理\n");
        }
        else if(lpPerIOHandleData->dwFlagsOp == SEND_POSTED)
        {
            printf("正在发送数据\n");
        }
        else
        {
            printf("客户机断开连接\n");
        }
 
        printf("初始化数据\n");
        dwFlags = 0;
 
        ZeroMemory(&lpPerIOHandleData->olData ,sizeof(OVERLAPPED));
        lpPerIOHandleData->wsaData.len  = 2048;
        lpPerIOHandleData->wsaData.buf  = lpPerIOHandleData->szBuffer;
        lpPerIOHandleData->dwFlagsOp    = RECV_POSTED;
 
        printf("接收数据\n");
        WSARecv(lpPerHandleData->sAccept ,
                &lpPerIOHandleData->wsaData ,1 ,
                &dwRecvs ,&dwFlags ,
                &lpPerIOHandleData->olData ,NULL);
 
    }
}红色那段代码啥意思?无论完成端口是是接收还是发送,都投递一个发送?

解决方案 »

  1.   

    这只是测试代码;
    功能在以上基础代码正常后再进行完善;
    但我现在的问题是,启动服务程序后,程序就会挂掉;
    单步跟踪:指示在GetQueuedCompletionStatus函数位置出错;如果有多个客户程序连入的时候,程序正常;
    如果启动服务程序,而没有连入客户端,就挂
      

  2.   


    更改代码为:if(lpPerIOHandleData->dwFlagsOp == RECV_POSTED)
            {
                dwFlags = 0;
                ZeroMemory(&lpPerIOHandleData->olData ,sizeof(OVERLAPPED));
                lpPerIOHandleData->wsaData.len  = 2048;
                lpPerIOHandleData->wsaData.buf  = lpPerIOHandleData->szBuffer;
                lpPerIOHandleData->dwFlagsOp    = RECV_POSTED;            printf("接收数据\n");
                WSASend(lpPerHandleData->sAccept ,
                    &lpPerIOHandleData->wsaData ,1 ,
                    &dwRecvs ,dwFlags ,
                    &lpPerIOHandleData->olData ,NULL);            printf("收到数据正在处理\n");
            }
            else if(lpPerIOHandleData->dwFlagsOp == SEND_POSTED)
            {
                dwFlags = 0;
                ZeroMemory(&lpPerIOHandleData->olData ,sizeof(OVERLAPPED));
                lpPerIOHandleData->wsaData.len  = 2048;
                lpPerIOHandleData->wsaData.buf  = lpPerIOHandleData->szBuffer;
                lpPerIOHandleData->dwFlagsOp    = RECV_POSTED;            printf("接收数据\n");
                WSARecv(lpPerHandleData->sAccept ,
                        &lpPerIOHandleData->wsaData ,1 ,
                        &dwRecvs ,&dwFlags ,
                        &lpPerIOHandleData->olData ,NULL);            printf("正在发送数据\n");
            }
            else
            {
                printf("客户机断开连接\n");
            }
    程序依然会异常终止
      

  3.   

    求指教呀。。
    到底是线程通信问题?
    还是完成端口的问题?
    哦god们
      

  4.   

    lz去研究一下http://bbs.csdn.net/topics/390978185这个吧,看起来还很不错,应该对你很有帮助