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
{
//这儿说明同步收到了数据
}
我一直是这么用的,运行得很好
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
{
//这儿说明同步收到了数据
}
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)
只要你有线程在调用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
{
//这儿说明同步收到了数据
}
我一直是这么用的,运行得很好
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
{
//这儿说明同步收到了数据
}
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)
只要你有线程在调用GetQueuedCompletionStatus(),必定会从完成端口得到通知,也就是说,WSARecv不成功的情况只有一种,返回值不等于0并且WSAGetLastError不是997(ERROR_IO_PENDING)
#9
都是由GetQueuedCompletionStatus()返回,只要你提交的请求返回正常。
#10
WSARecv()可能会返回数据,同时GetQueuedCompletionStatus()也会得到通知,所以一般无需在WSARecv()返回数据后直接处理。