WSARecv投递失败 WSAGetLastError()得到错误代码 6,调试两天了还是找不到错在哪

coorell 2008-12-05 08:41:13
为什么我调试了半天老是出错。。
WSARecv老是返回错误代号为6的值。。。
如果改用阻塞recv函数 ,却能成功接收到数据。。证明参数都没问题啊,
请各位老大帮忙看看。。
谢谢了 我自己都忙活2天楽 还是解决不了。。

出错代码段如下:
————————————————————————————
struct ClientContext
{
OVERLAPPED ol;

SOCKET socket;

WSABUF wsaRecvbuf;
char recvbuf[4096] ;
WSABUF wsaSendbuf;
char sendbuf[4096] ;

DWORD dwBytes, dwFlags;

BOOL Recv_onoff;
BOOL Send_onoff;
int pendind;
};


int ret;

MessageBox(NULL,"进入Accept函数...","accept",MB_OK);
SOCKET Accept ;
SOCKADDR_IN remote;
remote.sin_family = AF_INET;
remote.sin_addr.S_un.S_addr = INADDR_ANY;
remote.sin_port = htons( 6533 );

int len = sizeof(SOCKADDR);
ret = Accept = accept(pthis->m_listensocket, (SOCKADDR *)&remote, &len );
if( INVALID_SOCKET == ret )
MessageBox(NULL,"Accept失败", "Error",MB_OK);

MessageBox(NULL,"有主机连接...","accept",MB_OK);

ClientContext *pContext = new ClientContext;
memset(pContext->recvbuf,0,sizeof(pContext->recvbuf) );
pContext->socket = Accept;
pContext->wsaRecvbuf.buf = pContext->recvbuf;
pContext->wsaRecvbuf.len = 4096;
//pContext->wsaRecvbuf.len = sizeof(pContext->recvbuf);
pContext->wsaSendbuf.buf = pContext->sendbuf;
//pContext->wsaSendbuf.len = sizeof(pContext->sendbuf);
//pContext->dwBytes = 0;
pContext->dwFlags = 0;
pContext->Recv_onoff = TRUE;
pContext->Send_onoff = FALSE;


//send(pContext->socket,"传送过去了把",256,0);//如果把这两个阻塞模式的SENG和RECV去掉解释
//char mybuf[256]={'\0'}; //改用这两个函数来发送接收消息,可以成功接收发送
//recv(pContext->socket,mybuf,256,0); //RECV却可以成功接收到发送过来的消息并且成功打印出来!!
//MessageBox(NULL,mybuf,"recv Successful",MB_OK);//打印出消息


if(CreateIoCompletionPort( (HANDLE)Accept, pthis->h_iop, (ULONG_PTR)pContext, 0) ==NULL )
MessageBox(NULL,"关联到完成端口失败","error",MB_OK);

/////////////////////////////////////上面部分全部可以成功,到了投递WSARecv就失败,郁闷。。。 老大们帮忙啊。。都2天了///////////////////


ret = WSARecv(pContext->socket, &pContext->wsaRecvbuf, 1, &pContext->dwBytes, &pContext->dwFlags, &pContext->ol, NULL );

if( SOCKET_ERROR == ret)
{
UINT error = WSAGetLastError();
if(error !=ERROR_IO_PENDING)
{
CString str;
str.Format("错误代码:%d",error ); //错误代码:6 调试的时候也是的,而且pContext->socket值为286,不是无效的啊
MessageBox(NULL,"WSARecv失败",str,MB_OK);
}
}
...全文
611 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hanjingwz 2010-05-16
  • 打赏
  • 举报
回复
受教了,谢谢
笨笨的小猪 2010-05-16
  • 打赏
  • 举报
回复
做个标记啊。今天我也碰到了。
笨笨的小猪 2010-01-22
  • 打赏
  • 举报
回复
谢谢楼上地,帮俺解决了
凌乱1980 2008-12-06
  • 打赏
  • 举报
回复
加一句:memset(&pContext->ol,0,sizeof(pContext->ol) ); 就可以了
keven1868 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用楼主 coorell 的帖子:]
为什么我调试了半天老是出错。。
WSARecv老是返回错误代号为6的值。。。
如果改用阻塞recv函数 ,却能成功接收到数据。。证明参数都没问题啊,
请各位老大帮忙看看。。
谢谢了 我自己都忙活2天楽 还是解决不了。。

出错代码段如下:
————————————————————————————
struct ClientContext
{
OVERLAPPED ol;

SOCKET socket;

WSABUF wsaRecvbuf;
char recvbuf[4096] ;…
[/Quote]

其实错误码已经告诉你是什么问题了,无效句柄嘛,你的结构struct ClientContext 中的层叠结构OVERLAPPED ol里的HANDLE hEvent应当是一个有效的句柄,而你并没有为它创建一个有效的事件句柄
所以你前面初始化的时候应该补一句pContext->ol = WSACreateEvent();

18,356

社区成员

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

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