下面是IO完成端口工作线程中while( TRUE )里面的一段代码,但是在我WSASend以后,我
发现客户端接收到我发送出去的数据。本来这时应该再次跳进
GetQueuedCompletionStatus这个函数,但是,这段程序中却一直阻塞在
GetQueuedCompletionStatus函数这里,这是为什么呢?if (GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,
(LPDWORD)&PerHandleData, (LPOVERLAPPED *) &PerIoData, INFINITE) == 0)
{
DoLog("GetQueuedCompletionStatus failed with error %d", GetLastError());
return 0;
}.......................PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->DataBuf.len = strlen(PerIoData->Buffer);if (WSASend(PerHandleData->Socket2, &(PerIoData->DataBuf), 1, &SendBytes, 0,&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
DoLog("WSASend() failed with error %d\n", WSAGetLastError());
return 0;
}
}
发现客户端接收到我发送出去的数据。本来这时应该再次跳进
GetQueuedCompletionStatus这个函数,但是,这段程序中却一直阻塞在
GetQueuedCompletionStatus函数这里,这是为什么呢?if (GetQueuedCompletionStatus(CompletionPort, &BytesTransferred,
(LPDWORD)&PerHandleData, (LPOVERLAPPED *) &PerIoData, INFINITE) == 0)
{
DoLog("GetQueuedCompletionStatus failed with error %d", GetLastError());
return 0;
}.......................PerIoData->DataBuf.buf = PerIoData->Buffer;
PerIoData->DataBuf.len = strlen(PerIoData->Buffer);if (WSASend(PerHandleData->Socket2, &(PerIoData->DataBuf), 1, &SendBytes, 0,&(PerIoData->Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
DoLog("WSASend() failed with error %d\n", WSAGetLastError());
return 0;
}
}
解决方案 »
- [求助]DHCP抓包、报文格式、分析?
- 请教一下,关于MFC中CArray类声明的对象,能用作缓冲区接受变量吗?
- NDIS 如何拦截 HTTP 包
- 关于ActiveX控件注册的问题
- 怎么用界面传递一个int值和一个double值?
- 求助:用mfc编写一个软件
- 服务端刚开始能正常接收、处理客户端的请求,一会后就没反应了,什么信息都没有,客户端正常,什么原因啊?
- 请教一个关于解决SOCKET UDP通信的阻塞问题
- 字体的 处理
- poor bird, ADO,CPropertySheet,IDispatch error#3127
- 如何把从数据中画的图形写入到内存中去???再在屏幕上显示出来?
- 我最烦管理员给我发垃圾消息了
I/O口完成操作后,可能有什么原因使它不返回,仍然阻塞。
但还是收不到通知
请检查在你投递请求之前有没有把PerIoData里面的OVERLAPPED结构置0
没有的话试试先memset一下
我在调用WSASend之前对PerIoData->Overlapped进行了Zeromemory的操作。问题是这样解决的,但是问题解决了,不知道其中的道理:
先前,我在调用WSASend时,直接把收到在PerIoData->Buffer的数据发出,结果出错了
后来,我在调用WSASend前,先把PerIoData->Buffer的数据strcpy出来,再进行memset操作
,最后再把数据strcpy回PerIoData->Buffer,结果问题解决了。Why?