IOCP中用WSARecv接收不了客户端发来的数据

砍柴君 2013-03-25 06:29:46
我在服务端用WSARecv函数接受客户端发来的数据,当我在客户端中发数据后,在服务端中却看不到数据,这时的GetQueuedCompletionStatus函数中lpNumberOfBytes值为0;我的WSARecv函数是这样的
SOCKET socket=m_client[IDclient];
DWORD RecvBytes=0;
DWORD Flags=0;
MYOVERLAPPED *lpMyoverlapped=GetEmptyMyOverlapped(IDclient);
lpMyoverlapped->id=IDclient;
lpMyoverlapped->IoMode=recvMode;
WSARecv(socket,&lpMyoverlapped->wsaBuf,1,&RecvBytes,&Flags,lpMyoverlapped,NULL);
我的GetQueuedCompletionStatus函数代码为:
DWORD BytesTransferred=0;
MYOVERLAPPED *lpoverlapped=NULL;
SOCKET socket=NULL;
while (1)
{
if ( GetQueuedCompletionStatus(lpsocket->m_iocp, &BytesTransferred, (LPDWORD)&socket, (LPOVERLAPPED*)&lpoverlapped, INFINITE) == 0 )
求大神帮忙 谢谢了
...全文
245 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
砍柴君 2013-03-25
  • 打赏
  • 举报
回复
引用 9 楼 zilaishuichina 的回复:
当了还是什么出错了 当了是当在什么地方啊 出错那还是那句老话lasterror
不过没事了 只要像你说的那样 在GetEmptyMyOverlapped内申请内存就可以了,下次注意下就好,真是太感谢你了,实在太感谢了。结贴走起
砍柴君 2013-03-25
  • 打赏
  • 举报
回复
引用 9 楼 zilaishuichina 的回复:
当了还是什么出错了 当了是当在什么地方啊 出错那还是那句老话lasterror
一开始运行进入main函数就开始出错,不知道当在哪里,这个错误好隐秘;
zilaishuichina 2013-03-25
  • 打赏
  • 举报
回复
当了还是什么出错了 当了是当在什么地方啊 出错那还是那句老话lasterror
砍柴君 2013-03-25
  • 打赏
  • 举报
回复
引用 7 楼 zilaishuichina 的回复:
GetEmptyMyOverlapped里面有对wsabuff.buf申请内存么?
被你一提醒下才发现没申请内存 就去修改了下MYOVERLAPPED的结构体 typedef struct MYOVERLAPPED:public OVERLAPPED{ WSABUF WsaBuf; u_short id; UINT IoMode; char buff[MAX_SENDSIZE] MYOVERLAPPED() { Internal=0; InternalHigh=0; Offset=0; OffsetHigh=0; hEvent=0; IoMode=0; id=(WORD)-1; WsaBuf.buf=buff; WsaBuf.len=MAX_SENDSIZE; } }MYOVERLAPPED,LPMYOVERLAPPED; 在这结构体中定义了一个char数组buff,并将该数组地址给了WsaBuf.buf,运行了下程序发现程序直接出错了 请问这样是什么原因
zilaishuichina 2013-03-25
  • 打赏
  • 举报
回复
GetEmptyMyOverlapped里面有对wsabuff.buf申请内存么?
砍柴君 2013-03-25
  • 打赏
  • 举报
回复
引用 3 楼 zilaishuichina 的回复:
WSARecv返回值是多少啊 有没有错误码啊 WSAGetLastError看看啊
返回的是WSA_IO_PENDING 没有问题 我的部分代码已经贴出来了 因为代码太多 所以就贴了这有联系的部分 求帮忙看下 为嘛会接收不到客户端发来的数据
砍柴君 2013-03-25
  • 打赏
  • 举报
回复
终于有人了 好高兴啊 WSARecv返回的是WSA_IO_PENDING值 没有问题
砍柴君 2013-03-25
  • 打赏
  • 举报
回复
贴出下自己的代码: typedef struct MYOVERLAPPED:public OVERLAPPED{ WSABUF wsaBuf; u_short id; UINT IoMode; MYOVERLAPPED() { Internal=0; InternalHigh=0; Offset=0; OffsetHigh=0; hEvent=0; IoMode=0; id=(WORD)-1; wsaBuf.buf=NULL; wsaBuf.len=0; } }MYOVERLAPPED,LPMYOVERLAPPED; 下面这两个数组是CSOCKET的成员变量,CSOCKET是我自己定义的一个类 SOCKET m_client[MAX_USER]; MYOVERLAPPED m_myOverlapped[MAX_USER]; 下面的PostRecv函数是用来调用WSARecv来接收客户端的请求 BOOL CSOCKET::PostRecv(u_short IDclient, UINT recvMode) { SOCKET socket=m_client[IDclient]; DWORD RecvBytes=0; DWORD Flags=0; MYOVERLAPPED *lpMyoverlapped=GetEmptyMyOverlapped(IDclient); lpMyoverlapped->id=IDclient; lpMyoverlapped->IoMode=recvMode; if(WSARecv(socket,&lpMyoverlapped->wsaBuf,1,&RecvBytes,&Flags,lpMyoverlapped,NULL)==SOCKET_ERROR) { int Error=WSAGetLastError(); if (Error != WSA_IO_PENDING) { cout<<"WSARecv is fail:"<<WSAGetLastError()<<endl; deleteclient(IDclient); return FALSE; } } return TRUE; } 下面的threadiocp是线程的回调函数 DWORD WINAPI CSOCKET::threadiocp(LPVOID lparam) { CSOCKET *lpsocket=(CSOCKET *)lparam; DWORD BytesTransferred=0; MYOVERLAPPED *lpoverlapped=NULL; SOCKET socket=NULL; while (1) { if ( GetQueuedCompletionStatus(lpsocket->m_iocp, &BytesTransferred, (LPDWORD)&socket, (LPOVERLAPPED*)&lpoverlapped, INFINITE) == 0 ) { DWORD dwLastError = GetLastError(); if ( dwLastError != 64 ) { cout<<"GetQueuedCompletionStatus fail:"<<GetLastError()<<endl; } } if (BytesTransferred==0) { cout<<"客户:%d 退出!"<<lpoverlapped->id<<endl; lpsocket->deleteclient(lpoverlapped->id); continue; } 当我在客户端发送数据给服务端时,服务器调用threadiocp接收数据,但是这个时候BytesTransferred的值却为0,lpoverlapped->wsabuff.buf中没有数据,但是明明我在客户端那边有发数据了啊,为什么就接收不到呢 求帮忙 在这里谢谢谢谢了
zilaishuichina 2013-03-25
  • 打赏
  • 举报
回复
WSARecv返回值是多少啊 有没有错误码啊 WSAGetLastError看看啊
砍柴君 2013-03-25
  • 打赏
  • 举报
回复
没人吗 求助啊 这个问题困恼了我一天了
砍柴君 2013-03-25
  • 打赏
  • 举报
回复
自己顶下 求大神帮忙
1、本课程是一个干货课程,主要讲解如何封装服务器底层,使用Tcp/ip长连接,IDE使用vs2019 c++开发以及使用c++11的一些标准,跨平台windows和linux,服务器性能高效,单服务器压力测试上万无压力,服务器框架是经历过上线产品的验证,框架简单明了,不熟悉底层封装的人,半个小时就能完全掌握服务器框架上手写业务逻辑。2、本课程是一个底层服务器框架教程,主要是教会学员在windows或linux下如何封装一个高效的,避免踩坑的商业级框架,服务器底层使用初始化即开辟内存的技术,使用内存池,服务器运行期间内存不会溢出,非常稳定,同时服务器使用自定义哈希hashContainer,在处理新的连接,新的数据,新的封包,以及解包,发包,粘包的过程,哈希容器性能非常高效,增、删、查、改永远不会随着连接人数的上升而降低性能,增、删、查、改的复杂度永远都是恒定的O(1)。3、服务器底层封装没有使用任何第三方网络库以及任何第三方插件,自由度非常的高,出了任何BUG,你都有办法去修改,查找问题也非常方便,在windows下使用iocp,linux下使用epoll.4、讲解c++纯客户端,主要用于服务器之间通信,也就是说你想搭建多层结构的服务器,服务器与服务器之间使用socket通信。还可以使用c++客户端做压力测试,开辟多线程连接服务器,教程提供了压力测试,学员可以自己做压力测试服务器性能。5、赠送ue4和unity3d通信底层框架以及多人交互demo,登录,注册,玩家离开,同步主要是教会学员服务器与客户端如何交互。6、赠送c++连接mysql数据库框架demo,登录,注册,玩家离开数据持久化.7、服务器教程使用自定义通信协议,同时也支持protobuf,选择权在开发者自己手里,想用什么协议都可以,自由度高。8、服务器教程使用手动敲代码逐句讲解的方式开展教学课程。非喜勿喷,谢谢大家。9、服务器教程提供源码,大家可以在平台提供的地址下载或者联系我,服务器使用c++11部分标准,std::thread,条件变量,线程锁,智能指针等,需要学员具备一定c++知识,购买前请慎重考虑。

64,687

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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