DWORD WINAPI CompletionPortWorker(LPVOID lpvParam)
{
HANDLE hCompletionPort = (HANDLE)lpvParam;
LPPER_HANDLE_DATA lpPerHandleData = NULL;
LPPER_IO_HANDLE_DATA lpPerIOHandleData = NULL;
DWORD dwBytesTransferred ,dwFlags ,dwRecvs ,dwSends;
//WaitForSingleObject(hEvent ,INFINITE);
printf("工作者线程开始运行\n");
while(TRUE)
{
GetQueuedCompletionStatus(hCompletionPort ,
&dwBytesTransferred ,
(LPDWORD)lpPerHandleData ,
(LPOVERLAPPED *)&lpPerIOHandleData ,INFINITE);
if((dwBytesTransferred == 0 &&
(lpPerIOHandleData->dwFlagsOp == RECV_POSTED ||
lpPerIOHandleData->dwFlagsOp == SEND_POSTED)) ||
lpPerHandleData == NULL)
{
printf("Error : In CompletionFunction : %d\n" ,WSAGetLastError());
closesocket(lpPerHandleData->sAccept);
GlobalFree(lpPerHandleData);
GlobalFree(lpPerIOHandleData);
return 0;
}
if(lpPerIOHandleData->dwFlagsOp == RECV_POSTED)
{
printf("收到数据正在处理\n");
}
else if(lpPerIOHandleData->dwFlagsOp == SEND_POSTED)
{
printf("正在发送数据\n");
}
else
{
printf("客户机断开连接\n");
}
printf("初始化数据\n");
dwFlags = 0;
ZeroMemory(&lpPerIOHandleData->olData ,sizeof(OVERLAPPED));
lpPerIOHandleData->wsaData.len = 2048;
lpPerIOHandleData->wsaData.buf = lpPerIOHandleData->szBuffer;
lpPerIOHandleData->dwFlagsOp = RECV_POSTED;
printf("接收数据\n");
WSARecv(lpPerHandleData->sAccept ,
&lpPerIOHandleData->wsaData ,1 ,
&dwRecvs ,&dwFlags ,
&lpPerIOHandleData->olData ,NULL);
}
}红色那段代码啥意思?无论完成端口是是接收还是发送,都投递一个发送?
{
HANDLE hCompletionPort = (HANDLE)lpvParam;
LPPER_HANDLE_DATA lpPerHandleData = NULL;
LPPER_IO_HANDLE_DATA lpPerIOHandleData = NULL;
DWORD dwBytesTransferred ,dwFlags ,dwRecvs ,dwSends;
//WaitForSingleObject(hEvent ,INFINITE);
printf("工作者线程开始运行\n");
while(TRUE)
{
GetQueuedCompletionStatus(hCompletionPort ,
&dwBytesTransferred ,
(LPDWORD)lpPerHandleData ,
(LPOVERLAPPED *)&lpPerIOHandleData ,INFINITE);
if((dwBytesTransferred == 0 &&
(lpPerIOHandleData->dwFlagsOp == RECV_POSTED ||
lpPerIOHandleData->dwFlagsOp == SEND_POSTED)) ||
lpPerHandleData == NULL)
{
printf("Error : In CompletionFunction : %d\n" ,WSAGetLastError());
closesocket(lpPerHandleData->sAccept);
GlobalFree(lpPerHandleData);
GlobalFree(lpPerIOHandleData);
return 0;
}
if(lpPerIOHandleData->dwFlagsOp == RECV_POSTED)
{
printf("收到数据正在处理\n");
}
else if(lpPerIOHandleData->dwFlagsOp == SEND_POSTED)
{
printf("正在发送数据\n");
}
else
{
printf("客户机断开连接\n");
}
printf("初始化数据\n");
dwFlags = 0;
ZeroMemory(&lpPerIOHandleData->olData ,sizeof(OVERLAPPED));
lpPerIOHandleData->wsaData.len = 2048;
lpPerIOHandleData->wsaData.buf = lpPerIOHandleData->szBuffer;
lpPerIOHandleData->dwFlagsOp = RECV_POSTED;
printf("接收数据\n");
WSARecv(lpPerHandleData->sAccept ,
&lpPerIOHandleData->wsaData ,1 ,
&dwRecvs ,&dwFlags ,
&lpPerIOHandleData->olData ,NULL);
}
}红色那段代码啥意思?无论完成端口是是接收还是发送,都投递一个发送?
解决方案 »
- vs2008 做播放器 中Windows Media Player 控件问题 (全过程演示~)
- 请大家谈谈对文档/视图结构的认识
- socket编程的困惑?
- CTreeCtrl的CheckBox的触发消息是什么请不吝指教?
- 对话框中图像显示问题!!
- 一个困扰我很久的问题!各位帮忙看看吧!up有分!不够另开!
- vc三维点排序谁懂啊
- 请问这些文件有什么用?
- 请问,我在局域网内用udp协议发送数据,每个包是否大小不能超过1k?
- 谁能帮助解释一下这段程序嘛,其中buff 这个数组储存的是干什么的。
- VC++中如何把一个DOUBLE类型的变量A(它最多有两位小数)乘100后转存到一整形变量B中,如何避免A=140.38,转换出来是14037
- 如何对保护制定字符的网址进行处理
功能在以上基础代码正常后再进行完善;
但我现在的问题是,启动服务程序后,程序就会挂掉;
单步跟踪:指示在GetQueuedCompletionStatus函数位置出错;如果有多个客户程序连入的时候,程序正常;
如果启动服务程序,而没有连入客户端,就挂
更改代码为:if(lpPerIOHandleData->dwFlagsOp == RECV_POSTED)
{
dwFlags = 0;
ZeroMemory(&lpPerIOHandleData->olData ,sizeof(OVERLAPPED));
lpPerIOHandleData->wsaData.len = 2048;
lpPerIOHandleData->wsaData.buf = lpPerIOHandleData->szBuffer;
lpPerIOHandleData->dwFlagsOp = RECV_POSTED; printf("接收数据\n");
WSASend(lpPerHandleData->sAccept ,
&lpPerIOHandleData->wsaData ,1 ,
&dwRecvs ,dwFlags ,
&lpPerIOHandleData->olData ,NULL); printf("收到数据正在处理\n");
}
else if(lpPerIOHandleData->dwFlagsOp == SEND_POSTED)
{
dwFlags = 0;
ZeroMemory(&lpPerIOHandleData->olData ,sizeof(OVERLAPPED));
lpPerIOHandleData->wsaData.len = 2048;
lpPerIOHandleData->wsaData.buf = lpPerIOHandleData->szBuffer;
lpPerIOHandleData->dwFlagsOp = RECV_POSTED; printf("接收数据\n");
WSARecv(lpPerHandleData->sAccept ,
&lpPerIOHandleData->wsaData ,1 ,
&dwRecvs ,&dwFlags ,
&lpPerIOHandleData->olData ,NULL); printf("正在发送数据\n");
}
else
{
printf("客户机断开连接\n");
}
程序依然会异常终止
到底是线程通信问题?
还是完成端口的问题?
哦god们