IOCP WSASend遇到的奇怪问题?

songxz 2011-04-25 02:13:21
我写了一个IOCP类,用WSASend发送数据,通过
		BOOL isOK = GetQueuedCompletionStatus(
hCompletionPort,
&dwTrans,
(LPDWORD) &lpClientContext,
&lpOverlapped, INFINITE);
获取发送结果。发现有 dwTrans > lpOverlapped->m_wsabuf.len并且lpOverlapped->m_wsabuf.len == 0的情况出现。dwTrans 一般与原来发送的数据长度(lpOverlapped->m_wsabuf.len)相等。问题是lpOverlapped->m_wsabuf.len == 0这是什么原因引起的?另外数据是发送成功还是没有成功呢?

请高手指点。
...全文
143 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
songxz 2011-05-03
  • 打赏
  • 举报
回复
原因找到啦,是我发送数据处理有问题。结贴啦,参与的都有分!
mscrack 2011-04-28
  • 打赏
  • 举报
回复
内存访问断点, 看谁改了m_wsabuf.len, 应该就知道怎么回事了
Eleven 2011-04-26
  • 打赏
  • 举报
回复
你的lpOverlapped关联的Overlapped关联的确定是发送,不是接收??
liye378 2011-04-26
  • 打赏
  • 举报
回复
是不是 由于多次发送出现的原因啊?
我才刚刚接触IOCP。。下面是一段IOCP的代码,英文注释你看看。。


while (TRUE)
{
// 完成端口有消息来了
if (GetQueuedCompletionStatus(CompletionPort, & BytesTransferred,(LPDWORD) & PerHandleData, (LPOVERLAPPED * ) & PerIoData, INFINITE) == 0 )
{
printf( " GetQueuedCompletionStatus failed with error %d\n " , GetLastError());
return 0 ;
}

// 是不是有人退出了

if (BytesTransferred == 0 )
{
printf( " Closing socket %d\n " , PerHandleData -> Socket);

if (closesocket(PerHandleData -> Socket) == SOCKET_ERROR)
{
printf( " closesocket() failed with error %d\n " , WSAGetLastError());
return 0 ;
}

GlobalFree(PerHandleData);
GlobalFree(PerIoData);
continue ;
}

//

if (PerIoData -> BytesRECV == 0 )
{
PerIoData -> BytesRECV = BytesTransferred;
PerIoData -> BytesSEND = 0 ;
}
else
{
PerIoData -> BytesSEND += BytesTransferred;
}

if (PerIoData -> BytesRECV > PerIoData -> BytesSEND)
{

// Post another WSASend() request.
// Since WSASend() is not gauranteed to send all of the bytes requested,
// continue posting WSASend() calls until all received bytes are sent.
ZeroMemory( & (PerIoData -> Overlapped), sizeof (OVERLAPPED));
PerIoData -> DataBuf.buf = PerIoData -> Buffer + PerIoData -> BytesSEND;
PerIoData -> DataBuf.len = PerIoData -> BytesRECV - PerIoData -> BytesSEND;
if (WSASend(PerHandleData -> Socket, & (PerIoData -> DataBuf), 1 , & SendBytes, 0 ,
& (PerIoData -> Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf( " WSASend() failed with error %d\n " , WSAGetLastError());
return 0 ;
}
}
}
else
{
PerIoData -> BytesRECV = 0 ;

// Now that there are no more bytes to send post another WSARecv() request.

Flags = 0 ;
ZeroMemory( & (PerIoData -> Overlapped), sizeof (OVERLAPPED));

PerIoData -> DataBuf.len = DATA_BUFSIZE;
PerIoData -> DataBuf.buf = PerIoData -> Buffer;

if (WSARecv(PerHandleData -> Socket, & (PerIoData -> DataBuf), 1 , & RecvBytes, & Flags, & (PerIoData -> Overlapped), NULL) == SOCKET_ERROR)
{
if (WSAGetLastError() != ERROR_IO_PENDING)
{
printf( " WSARecv() failed with error %d\n " , WSAGetLastError());
return 0 ;
}
}
}
}
songxz 2011-04-26
  • 打赏
  • 举报
回复
没有重复发送,Overlapped关联的是发送,不是接收

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧