WSARecv返回值为SOCKET_ERROR

shanghaixiaoyu 2012-10-25 04:45:23
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() != ERROR_IO_PENDING)
{
return false;
}
}
return true;
}


在线程中执行,其中
m_sockAccpet 为Accept Socket
WSAOVERLAPPED m_iReadIO; //读完成例程
WSABUF wsaRecvBuf;
IReadRoutine为回调函数

没有接收到数据时,WSARecv返回值为SOCKET_ERROR ,当有数据到来时,程序直接执行到回调函数(系统调用),请问哪里错了导致WSARecv返回值为SOCKET_ERROR
...全文
573 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dark89757 2014-06-18
  • 打赏
  • 举报
回复
急急急,直接调WSARecv,返回-1,先调recv,然后调WSARecv就成功了,为什么?
jimette 2013-03-13
  • 打赏
  • 举报
回复
您好, 由于您长时间不结贴,上一次答复已超一个月并且已有最佳答案,本人帮你结贴。 若是觉得答案不嘉,请放在本版的疑难杂症帖链接: http://bbs.csdn.net/topics/390351579。 如果您有什么意见,请您联系我。
shanghaixiaoyu 2012-10-30
  • 打赏
  • 举报
回复
// 接收数据
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中读取数据
[Quote=引用 6 楼 的回复:]

贴完整代码, 关于回调的重叠io

似乎只有windows网络编程 第八章有源码,其他都没有什么例子
[/Quote]
bsnry 2012-10-30
  • 打赏
  • 举报
回复
贴完整代码, 关于回调的重叠io

似乎只有windows网络编程 第八章有源码,其他都没有什么例子

bsnry 2012-10-30
  • 打赏
  • 举报
回复
m_iReadIO.hEvent = WSAEVENT(this);


pClient = (CClientFromShip*)lpOverlapped->hEvent; //客户端指针


可否贴:

WSAEVENT这个类

还有: pClient


shanghaixiaoyu 2012-10-29
  • 打赏
  • 举报
回复
在回调过程中,做了对接收数据的处理,可以忽略不计,在最后重新调用了RecvData函数
[Quote=引用 4 楼 的回复:]

贴下你回调过程的处理。
[/Quote]
fang 2012-10-26
  • 打赏
  • 举报
回复
贴下你回调过程的处理。
fang 2012-10-26
  • 打赏
  • 举报
回复
wsaRecv仅仅是你投递接操作,告诉系统你做了一次这样的操作,成功不成功是你在返回值可以判断的,接收数据是在你的完成回调过程里面接收告诉你多少数据接收完成在这个过程中处理完接收数据的处理后可以再做wsarecv的投递操作。
shanghaixiaoyu 2012-10-26
  • 打赏
  • 举报
回复
现在的问题是可以接收到数据,但是每次都一有数据进来,就执行回调函数,wsaRecvBuf中却显示没有值
fang 2012-10-25
  • 打赏
  • 举报
回复
完成是这样处理的啊,
if (WSARecv == SOCKET_ERROR)
{
WSAGetLastError返回是值是WSA_IO_PENDING说明你的WSARecv投递是成功的。投递了一次WSARecv有数据就进入数据回调。
}

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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