UDP IOCP 接收数据 崩溃??
RT 一接收数据程序就崩溃了... 代码如下:(xp vs08 定位下来是 GetQueuedCompletionStatus 出错了,但是不知道是何原因...)
#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();}