首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

GetQueuedCompletionStatus函数没返回

2013-04-26 
GetQueuedCompletionStatus函数没有返回连接成功了的,并且客户端也显示数据发送成功的,但是服务器就是无法

GetQueuedCompletionStatus函数没有返回
连接成功了的,并且客户端也显示数据发送成功的,但是服务器就是无法显示数据!!

另外,在ServerThread线程中,下面的操作也存在问题,怎么删除主线程中new的资源呢?!我看很多的资料都是这么写的,怎么修改?!!


closesocket(pPer_Handle_Data->sock);
delete pPer_Handle_Data;
delete pPer_IO_Data;




#include "CommonHeader.h"
 
using namespace std;
 
#pragma comment(lib,"ws2_32.lib")
 
#define BUFFER_SIZE 4096
#define PORT 12345
 
 
#define  OP_READ 1
#define  OP_WRITE 2
#define     OP_ACCEPT 3
 
static int index=0;
 
HANDLE hCompletion;
typedef struct _PER_HANDLE_DATA
{
    SOCKET sock;
    sockaddr_in si;
}PER_HANDLE_DATA,*PPER_HANDLE_DATA;
 
 
typedef struct _PER_IO_DATA
{
    WSAOVERLAPPED overlapped;
    WSABUF wsabuf;
    char buffer[BUFFER_SIZE];
    int operationType;
}PER_IO_DATA,*PPER_IO_DATA;
DWORD WINAPI ServerThread(LPVOID lParam);
int main()
{
    WSADATA wsa;
    WSAStartup(MAKEWORD(2,2),&wsa);
     
     
    hCompletion=::CreateIoCompletionPort(INVALID_HANDLE_VALUE,0,0,0);
    CreateThread(NULL,0,ServerThread,(LPVOID)hCompletion,0,0);
     
    SOCKET sListen=socket(AF_INET,SOCK_STREAM,0);
    sockaddr_in si;
    si.sin_family=AF_INET;
    si.sin_port=htons(PORT);
    si.sin_addr.S_un.S_addr=INADDR_ANY;
    bind(sListen,(SOCKADDR *)&si,sizeof(SOCKADDR));
    listen(sListen,5);
     
    while(TRUE)
    {
        sockaddr_in RemoteInfo;
        int RemoteLen=sizeof(sockaddr_in);
        SOCKET AcceptClient=accept(sListen,(sockaddr*)&RemoteInfo,&RemoteLen);
         
        //每当有新连接时,将为其创建PER_HANDLE_DATA数据和PER_IO_DATA数据。
        //PER_HANDLE_DATA
        PPER_HANDLE_DATA pPerHandleData=new PER_HANDLE_DATA();
        pPerHandleData->sock=AcceptClient;
        memcpy(&(pPerHandleData->si),&RemoteInfo,sizeof(sockaddr));
        //将套接字句柄与完成端口相关联
        CreateIoCompletionPort((HANDLE)pPerHandleData->sock,hCompletion,
            (DWORD)pPerHandleData,0);
         
         
        //PER_IO_DATA
        PPER_IO_DATA pPer_IO_Data=new PER_IO_DATA();
        pPer_IO_Data->operationType=OP_READ;
        //WSARecv等函数中,缓冲区必须是WSABUF,下面对WSABUF进行初始化


        pPer_IO_Data->wsabuf.buf=pPer_IO_Data->buffer;
        pPer_IO_Data->wsabuf.len=BUFFER_SIZE;
         
         
        DWORD dwRecv;
        DWORD dwFlags=0;
         
        //投递一个接收请求
        ::WSARecv(pPerHandleData->sock,&(pPer_IO_Data->wsabuf),
            1,&dwRecv,&dwFlags,&(pPer_IO_Data->overlapped),NULL);
    }
     
    return 0;
}
 
DWORD WINAPI ServerThread(LPVOID lParam)
{
     
    HANDLE hCompletion=(HANDLE)lParam;
    DWORD dwTrans;
    PPER_HANDLE_DATA pPer_Handle_Data;
    PPER_IO_DATA pPer_IO_Data;
    cout<<"ServerThread"<<endl;
    while (TRUE)
    {
         
        bool bOk=GetQueuedCompletionStatus(hCompletion,&dwTrans,(LPDWORD)&pPer_Handle_Data,(LPWSAOVERLAPPED*)&pPer_IO_Data,WSA_INFINITE);
        if(!bOk)
        {
            //在此套接字上有错误发生
            closesocket(pPer_Handle_Data->sock);
            delete pPer_Handle_Data;
            delete pPer_IO_Data;
            continue;
        }
         
        //套接字被对方关闭
        if(dwTrans==0 /*&&(pPer_IO_Data->operationType==OP_READ)||(pPer_IO_Data->operationType==OP_WRITE)*/)
        {
            closesocket(pPer_Handle_Data->sock);
            delete pPer_Handle_Data;
            delete pPer_IO_Data;
            continue;
        }
         
         
        switch(pPer_IO_Data->operationType)
        {
            cout<<"Switch"<<endl;
        case OP_READ:
            {
 
                pPer_IO_Data->buffer[dwTrans]='\0';
                cout<<pPer_IO_Data->buffer<<endl;


                index++;
                cout<<index<<endl;
                 
                 
                //继续投递IO操作
                pPer_IO_Data->wsabuf.buf=pPer_IO_Data->buffer;
                pPer_IO_Data->wsabuf.len=BUFFER_SIZE;
                pPer_IO_Data->operationType=OP_READ;
                DWORD flags=0;
                WSARecv(pPer_Handle_Data->sock,&(pPer_IO_Data->wsabuf),1,&dwTrans,&flags,&(pPer_IO_Data->overlapped),NULL);
            }
        case OP_WRITE:
            break;
        case OP_ACCEPT:
            break;
        }
    }
    return 0;
}


[解决办法]

热点排行