完成端口的异步操作问题

时间:2022-10-21 23:50:28
使用了完成端口和异步IO以后,WSARecv()有没有可能立即返回并收到数据?还是每个异步操作都必须由GetQueuedCompletionStatus()返回?这个问题对我写代码非常重要,希望能得到权威和肯定的回答。谢谢。好久没上CSDN了,分太少了,希望各位不要介意。

10 个解决方案

#1


如果用异步操作的话,WSARecv() 是不会因为收到数据而马上返回的. 

必须用异步操作那些东西.

#2


异步操作通过select等模型来触发

#3


普遍情况下都不会

#4


res = WSARecv(p.s,&p.recvDesc,1,&p.n, &p.recvFlags,(_OVERLAPPED *)&p,0);
if (res == SOCKET_ERROR && WSAGetLastError() != ERROR_IO_PENDING )
{  //如果返回错误,并且该错误 不是 (ERROR_IO_PENDING即重叠操作会在以后完成)
   OnClose(p);//关闭套接字p.s,并重置为侦听
}
else
{
  //这儿说明同步收到了数据
}
我一直是这么用的,运行得很好

#5


改正下
res = WSARecv(p.s,&p.recvDesc,1,&p.n, &p.recvFlags,(_OVERLAPPED *)&p,0);
if (res == SOCKET_ERROR)
{
  //如果返回错误,并且该错误 不是 (ERROR_IO_PENDING即重叠操作会在以后完成)
  if(WSAGetLastError() != ERROR_IO_PENDING )  
   OnClose(p);//关闭套接字p.s,并重置为侦听
}
else
{
  //这儿说明同步收到了数据
}

#6


多谢几位, 再等等其它高手的答复

#7



BOOL bRet = ::GetQueuedCompletionStatus(hiocp, &dwBytes, &dwKey, (OVERLAPPED **)&lpoex, INFINITE);

也要判断dwBytes是否大于0.

#8


使用了完成端口和异步IO以后,WSARecv()有没有可能立即返回并收到数据?
只要你有线程在调用GetQueuedCompletionStatus(),必定会从完成端口得到通知,也就是说,WSARecv不成功的情况只有一种,返回值不等于0并且WSAGetLastError不是997(ERROR_IO_PENDING)

#9


都是由GetQueuedCompletionStatus()返回,只要你提交的请求返回正常。

#10


WSARecv()可能会返回数据,同时GetQueuedCompletionStatus()也会得到通知,所以一般无需在WSARecv()返回数据后直接处理。

#1


如果用异步操作的话,WSARecv() 是不会因为收到数据而马上返回的. 

必须用异步操作那些东西.

#2


异步操作通过select等模型来触发

#3


普遍情况下都不会

#4


res = WSARecv(p.s,&p.recvDesc,1,&p.n, &p.recvFlags,(_OVERLAPPED *)&p,0);
if (res == SOCKET_ERROR && WSAGetLastError() != ERROR_IO_PENDING )
{  //如果返回错误,并且该错误 不是 (ERROR_IO_PENDING即重叠操作会在以后完成)
   OnClose(p);//关闭套接字p.s,并重置为侦听
}
else
{
  //这儿说明同步收到了数据
}
我一直是这么用的,运行得很好

#5


改正下
res = WSARecv(p.s,&p.recvDesc,1,&p.n, &p.recvFlags,(_OVERLAPPED *)&p,0);
if (res == SOCKET_ERROR)
{
  //如果返回错误,并且该错误 不是 (ERROR_IO_PENDING即重叠操作会在以后完成)
  if(WSAGetLastError() != ERROR_IO_PENDING )  
   OnClose(p);//关闭套接字p.s,并重置为侦听
}
else
{
  //这儿说明同步收到了数据
}

#6


多谢几位, 再等等其它高手的答复

#7



BOOL bRet = ::GetQueuedCompletionStatus(hiocp, &dwBytes, &dwKey, (OVERLAPPED **)&lpoex, INFINITE);

也要判断dwBytes是否大于0.

#8


使用了完成端口和异步IO以后,WSARecv()有没有可能立即返回并收到数据?
只要你有线程在调用GetQueuedCompletionStatus(),必定会从完成端口得到通知,也就是说,WSARecv不成功的情况只有一种,返回值不等于0并且WSAGetLastError不是997(ERROR_IO_PENDING)

#9


都是由GetQueuedCompletionStatus()返回,只要你提交的请求返回正常。

#10


WSARecv()可能会返回数据,同时GetQueuedCompletionStatus()也会得到通知,所以一般无需在WSARecv()返回数据后直接处理。