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

UDP IOCP 接收数据 崩溃?解决办法

2012-06-20 
UDP IOCP 接收数据 崩溃??RT 一接收数据程序就崩溃了... 代码如下:(xp vs08 定位下来是 GetQueuedCompleti

UDP IOCP 接收数据 崩溃??
RT 一接收数据程序就崩溃了... 代码如下:(xp vs08 定位下来是 GetQueuedCompletionStatus 出错了,但是不知道是何原因...)

C/C++ code
#include <Winsock2.h>#include <windows.h>#include <stdio.h>#pragma comment(lib,"ws2_32.lib")SOCKET    global_skt = 0;HANDLE    global_hIOCP = 0;char    global_bufRecv[2048] = {0};OVERLAPPED    global_ol = {0};void PostRECV(){    WSABUF wsabuf = {0};    wsabuf.buf = global_bufRecv;    wsabuf.len = sizeof(global_bufRecv);    DWORD dwFlags = 0;     int iDnsSALen = sizeof(sockaddr_in);    DWORD dwRecv;    sockaddr_in siDnsRecv = {0};    if (SOCKET_ERROR == WSARecvFrom(global_skt, &wsabuf, 1, &dwRecv, &dwFlags, (sockaddr*)&siDnsRecv, &iDnsSALen, &global_ol, NULL))    {        printf("WSARecvFrom err : %d\n", WSAGetLastError());    }}DWORD WINAPI ThreadProc(LPVOID _lpParameter){    printf("GetCurrentThreadId() : %d\n", GetCurrentThreadId());    PostRECV();    DWORD dwTrans = 0, dwCompletionKey = 0;    OVERLAPPED* pol = NULL;        while (1)    {        int iRtn = GetQueuedCompletionStatus(            global_hIOCP,            &dwTrans,            &dwCompletionKey,            &pol,            WSA_INFINITE);                if (! iRtn)        {            int iErr = WSAGetLastError();            printf("GetQueuedCompletionStatus failed : (%d) %d\n", ::GetCurrentThreadId(), iErr);            return 0;        }                {            printf("(%d)RECV : %s\n", GetCurrentThreadId(), global_bufRecv);            PostRECV();        }    }        return 0;}void main(){    WSADATA wsaData = {0};    int iErr = WSAStartup(MAKEWORD(2,2), &wsaData);    if (iErr != 0)    {        printf("WSAStartup err : %d - %d\n", iErr, WSAGetLastError());        return;    }    global_skt = WSASocket(AF_INET, SOCK_DGRAM, IPPROTO_IP, NULL, 0, WSA_FLAG_OVERLAPPED);        if (global_skt == INVALID_SOCKET)    {        printf("WSASocket INVALID_SOCKET : %d\n", WSAGetLastError());        return;    }        sockaddr_in si1 = {0};    si1.sin_family = AF_INET;    si1.sin_port = htons(9999);    si1.sin_addr.S_un.S_addr = INADDR_ANY;    if (SOCKET_ERROR == bind(global_skt, (sockaddr*)&si1, sizeof(sockaddr_in)))    {        printf("bind SOCKET_ERROR : %d\n", WSAGetLastError());        return;    }        global_hIOCP = CreateIoCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0);    if (global_hIOCP == 0)    {        printf("CreateIoCompletionPort INVALID_HANDLE_VALUE err : %d\n", GetLastError());        return;    }    HANDLE hRtn = CreateIoCompletionPort((void*)global_skt, global_hIOCP, 0, 0);    if (hRtn == 0)    {        printf("CreateIoCompletionPort skt err : %d\n", GetLastError());        return;    }        global_ol.hEvent = WSACreateEvent();        CreateThread(NULL, 0, ThreadProc, NULL, 0, NULL);    getchar();}


[解决办法]
探讨

sockaddr_in siDnsRecv = {0}; 放全局 试试

[解决办法]
探讨

引用:
引用:

sockaddr_in siDnsRecv = {0}; 放全局 试试


定义为全局
int iDnsSALen = sizeof(sockaddr_in);
sockaddr_in siDnsRecv = {0};

貌似 确实是这样。
真没往这边想,现在想想,应该是 GetQueuedCompletionStatus……

热点排行