android 小米udp崩溃,UDP IOCP 接收数据 崩溃?解决办法

这段代码展示了如何在C/C++中利用WSARecvFrom和IO Completion Ports(IOCP)进行UDP数据包的异步接收。主要功能包括初始化Winsock,创建并绑定UDP套接字,设置IOCP,创建接收线程以及处理接收到的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值