为什么我调试了半天老是出错。。
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);
}
}
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);
}
}
解决方案 »
- 求...支持RS232和以太网通迅的网络编程思路!急...
- (100分)turbo c++ 中运行的程序如何在vc中运行
- 在运行时如何获得LISTCTRL的列的总数?
- 怎样用VC++显示一个实时的波形图?
- 请教PNG8位索引色中IDAT部分的数据结构
- cobject 动态创建?(高手请进,难度很大!)
- 用c语言实现旅行商问题的c-w节约算法.
- 日文Windows中输入的中文在中文Windows中为什么不能显示
- 做视频捕获,压缩和传输有什么好的主意???
- 怎么样把自己写的一个类做成DLL,并在别的程序中使用它?
- 关于CSocket中使用CArchive进行流操作的问题
- 主线程控制子线程的运行,用PostThreadMessage和用WaitForSingleObject等待事件的方式哪种效率更好?还有ResumeThread()
其实错误码已经告诉你是什么问题了,无效句柄嘛,你的结构struct ClientContext 中的层叠结构OVERLAPPED ol里的HANDLE hEvent应当是一个有效的句柄,而你并没有为它创建一个有效的事件句柄
所以你前面初始化的时候应该补一句pContext->ol = WSACreateEvent();