请教一个IOCP关于WSASend的变量声明问题!

tlbbsff 2018-01-10 10:28:24
请教一个IOCP关于WSASend的变量声明问题!
代码1如下
void  ClientContext::PostSend ( LPBYTE lpData, UINT nSize )
{ OVERLAPPEDPLUS * pOverlap = new OVERLAPPEDPLUS(IOWrite);
ULONG ulFlags = MSG_PARTIAL;
m_WriteBuffer.Write((PBYTE)&nSize, sizeof(nSize));
m_WriteBuffer.Write(lpData, nSize);
m_wsaOutBuffer.buf = (char*) m_WriteBuffer.GetBuffer(); //注意:这里是成员变量
m_wsaOutBuffer.len = m_WriteBuffer.GetBufferLen();
int nRetVal = WSASend( m_Socket, &m_wsaOutBuffer,1,&m_wsaOutBuffer.len,ulFlags,&pOverlap->m_ol,NULL);
}

代码2
void  ClientContext::PostSend ( LPBYTE lpData, UINT nSize )
{ OVERLAPPEDPLUS * pOverlap = new OVERLAPPEDPLUS(IOWrite);
WSABUF sndBuf;
ULONG ulFlags = MSG_PARTIAL;

m_WriteBuffer.Write((PBYTE)&nSize, sizeof(nSize));
m_WriteBuffer.Write(lpData, nSize);
sndBuf.buf = (char*) m_WriteBuffer.GetBuffer(); //注意:这里是局部变量
sndBuf.len = m_WriteBuffer.GetBufferLen();
int nRetVal = WSASend( m_Socket, &m_wsaOutBuffer,1,&m_wsaOutBuffer.len,ulFlags,&pOverlap->m_ol,NULL);
}


请问代码2中,因为WSAsend会马上返回,局部变量难道不会发生析构吗?
问题2: 代码1是成员变量,WSAsend是重叠的,马上返回,如果第一次还没发送完成,那么第二次又调用了PostSend函数,此时第一次还没发送完全,m_WriteBuffer指向的数据已经发生改变,请问我的分析对吗?
正确的该如何写?


...全文
628 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
smwhotjay 2018-01-13
  • 打赏
  • 举报
回复
多个WSASend 共用1个buff肯定会有问题。
tlbbsff 2018-01-13
  • 打赏
  • 举报
回复
账号:tlbbsff 昵称:tlbbsff 自己 博客空间 最新帖子: 请教一个IOCP关于WSASend的变量... 请教一个小问题,如何从编辑框(E... 请教 ,类模编成板初始化,请问... 更多 >> tlbbsff T1 感谢楼上,请你回答下这个问题,谢谢 代码1是成员变量,WSAsend是重叠的,马上返回,如果第一次还没发送完成,那么第二次又调用了PostSend函数, 此时第一次还没发送完全,m_WriteBuffer指向的数据已经发生改变,请问我的分析对吗?
smwhotjay 2018-01-11
  • 打赏
  • 举报
回复
m_WriteBuffer.GetBuffer(); 哪里就局部变量了? m_WriteBuffer 一看名称,就是成员write buffer GetBuffer()只是获得指针,
赵4老师 2018-01-11
  • 打赏
  • 举报
回复
tlbbsff 2018-01-11
  • 打赏
  • 举报
回复
感谢楼上,请你回答下这个问题,谢谢 代码1是成员变量,WSAsend是重叠的,马上返回,如果第一次还没发送完成,那么第二次又调用了PostSend函数, 此时第一次还没发送完全,m_WriteBuffer指向的数据已经发生改变,请问我的分析对吗?
Dobzhansky 2018-01-11
  • 打赏
  • 举报
回复
csdn强行插楼十分恶心
夫人的泡泡鱼 2018-01-10
  • 打赏
  • 举报
回复
没有发送完成的数据应该是放在发送缓冲区中,而不会因为程序的析构清空发送缓冲区的数据。可能你的程序关闭了,但是网络还在发送数据,因为发送缓冲区中还有未发送完的数据。 http://download.csdn.net/download/zqckzqck/6468185 http://download.csdn.net/download/zqckzqck/6802705 这些资源参考看下。 其实如果并发数量没有很多,不建议使用IOCP。
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++知识,购买前请慎重考虑。

18,356

社区成员

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

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