WSARecv返回值为SOCKET_ERROR 完成是这样处理的啊,if (WSARecv == SOCKET_ERROR){WSAGetLastError返回是值是WSA_IO_PENDING说明你的WSARecv投递是成功的。投递了一次WSARecv有数据就进入数据回调。} 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 现在的问题是可以接收到数据,但是每次都一有数据进来,就执行回调函数,wsaRecvBuf中却显示没有值 wsaRecv仅仅是你投递接操作,告诉系统你做了一次这样的操作,成功不成功是你在返回值可以判断的,接收数据是在你的完成回调过程里面接收告诉你多少数据接收完成在这个过程中处理完接收数据的处理后可以再做wsarecv的投递操作。 在回调过程中,做了对接收数据的处理,可以忽略不计,在最后重新调用了RecvData函数 贴完整代码, 关于回调的重叠io似乎只有windows网络编程 第八章有源码,其他都没有什么例子 // 接收数据bool CXXXX::RecvData(void){ DWORD dwBytesRecved; //接收字节数 DWORD dwFlags = 0; //接收标志 ZeroMemory(&m_iReadIO, sizeof(WSAOVERLAPPED)); //重叠结构置0 m_iReadIO.hEvent = WSAEVENT(this); char recvBuf[MAX_BUF_SIZE]; ZeroMemory(recvBuf, MAX_BUF_SIZE); wsaRecvBuf.len = MAX_BUF_SIZE;// wsaRecvBuf.__byte_writableTo(MAX_BUF_SIZE) = recvBuf; wsaRecvBuf.buf = recvBuf; //异步接收数据 if (SOCKET_ERROR == WSARecv(m_sockAccpet, &wsaRecvBuf, 1, &dwBytesRecved, &dwFlags, &m_iReadIO, IReadRoutine)) { if (WSAGetLastError() != WSA_IO_PENDING) { closesocket(m_sockAccpet); return false; //continue; } } return true;}void CALLBACK CXXXX::IReadRoutine(DWORD dwError, DWORD dwTransferred, LPWSAOVERLAPPED lpOverlapped , DWORD dwFlags){ CClientFromShip *pClient = NULL; pClient = (CClientFromShip*)lpOverlapped->hEvent; //客户端指针 if (dwError != 0 || dwTransferred == 0) //错误处理 { pClient->m_bDead = true; return; } pClient->HandleData();}void CXXXX::HandleData(void){ RecvData();}基本就是参考Windows网络编程的代码,只是没有用包头和包体的方式,想直接从WSABUF中读取数据 m_iReadIO.hEvent = WSAEVENT(this);pClient = (CClientFromShip*)lpOverlapped->hEvent; //客户端指针可否贴:WSAEVENT这个类还有: pClient 您好,由于您长时间不结贴,上一次答复已超一个月并且已有最佳答案,本人帮你结贴。若是觉得答案不嘉,请放在本版的疑难杂症帖链接:http://bbs.csdn.net/topics/390351579。如果您有什么意见,请您联系我。 急急急,直接调WSARecv,返回-1,先调recv,然后调WSARecv就成功了,为什么? 给主窗体发送一个数据块。 网络通信 密钥交换 SQL2000中日期字段的问题 MSDN出问题了,谁解决了给100分(用我的信誉担保),同情者给2分! 求教__declspec(dllexport) 的用法 我想加速对一个大数据文件的读取,有何办法? 如何让任何bmp文件转化为24位的bmp?? 如何获得当前登录window2000 telnet server的用户列表及来源IP 关于VC中的CFileDlg的问题 关于SetWindowPos的最后一个参数 OnTimer函数中刷新主对话框导致焦点的问题? HTTP协议奇怪现象,求大神解释
bool CXXXX::RecvData(void)
{
DWORD dwBytesRecved; //接收字节数
DWORD dwFlags = 0; //接收标志 ZeroMemory(&m_iReadIO, sizeof(WSAOVERLAPPED)); //重叠结构置0
m_iReadIO.hEvent = WSAEVENT(this);
char recvBuf[MAX_BUF_SIZE];
ZeroMemory(recvBuf, MAX_BUF_SIZE);
wsaRecvBuf.len = MAX_BUF_SIZE;
// wsaRecvBuf.__byte_writableTo(MAX_BUF_SIZE) = recvBuf;
wsaRecvBuf.buf = recvBuf;
//异步接收数据
if (SOCKET_ERROR == WSARecv(m_sockAccpet, &wsaRecvBuf, 1, &dwBytesRecved, &dwFlags, &m_iReadIO, IReadRoutine))
{
if (WSAGetLastError() != WSA_IO_PENDING)
{
closesocket(m_sockAccpet);
return false;
//continue;
}
}
return true;
}
void CALLBACK CXXXX::IReadRoutine(DWORD dwError, DWORD dwTransferred, LPWSAOVERLAPPED lpOverlapped , DWORD dwFlags)
{
CClientFromShip *pClient = NULL;
pClient = (CClientFromShip*)lpOverlapped->hEvent; //客户端指针
if (dwError != 0 || dwTransferred == 0) //错误处理
{
pClient->m_bDead = true;
return;
}
pClient->HandleData();}void CXXXX::HandleData(void)
{
RecvData();
}
基本就是参考Windows网络编程的代码,只是没有用包头和包体的方式,想直接从WSABUF中读取数据
pClient = (CClientFromShip*)lpOverlapped->hEvent; //客户端指针
可否贴:WSAEVENT这个类还有: pClient
您好,
由于您长时间不结贴,上一次答复已超一个月并且已有最佳答案,本人帮你结贴。
若是觉得答案不嘉,请放在本版的疑难杂症帖链接:
http://bbs.csdn.net/topics/390351579。
如果您有什么意见,请您联系我。