下面是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;
}
}
解决方案 »
- 内存块频繁申请释放的问题
- SendMessage(..............)这句话什么意思?
- 全局变量怎么声明
- 有谁去掉过不规则窗体(SetWindowRgn)的粗糙边缘?
- CWinThread派生的线程类关闭时要执行一些操作,该怎么做?
- 软件发布--文件管理器
- ATL写过一个COM组件(MBCS下编译),如果安装在中文路径下的话,注册就会失败.
- console程序中如何测试main的返回值?在先等待!
- 对话框上能添加的控件数量是有限制的吗,为什么必须删掉一个才能添加一个呢
- CMutex类如何与被自己保护的变量联系起来
- 如何把从数据中画的图形写入到内存中去???再在屏幕上显示出来?
- 我最烦管理员给我发垃圾消息了
I/O口完成操作后,可能有什么原因使它不返回,仍然阻塞。
但还是收不到通知
请检查在你投递请求之前有没有把PerIoData里面的OVERLAPPED结构置0
没有的话试试先memset一下
我在调用WSASend之前对PerIoData->Overlapped进行了Zeromemory的操作。问题是这样解决的,但是问题解决了,不知道其中的道理:
先前,我在调用WSASend时,直接把收到在PerIoData->Buffer的数据发出,结果出错了
后来,我在调用WSASend前,先把PerIoData->Buffer的数据strcpy出来,再进行memset操作
,最后再把数据strcpy回PerIoData->Buffer,结果问题解决了。Why?