C/C++ code#include
#include
#include
#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();
}