粘包问题,求助

苦逼码农 2016-02-18 09:05:48
"iocp 粘包"的帖子,我看过不少,

高手们都提到一句话————————“不要对同一个socket,同时wsasend, wsarecv"即可。

请问如何做到———— 不要对同一个socket ,同时进行wsasedn, wsarecv 操作呢?

客户端用到了堵塞式套接字编程, 服务器用到了iocp。

由于iocp需要开辟2*n+2个线城,即使客户端按照顺序的发送数据 但是由于 服务器多线程的原因,会打断recv,导致最终接受的数据乱序。

我总不能只用一个线城接受吧?

具体如下:

客户端发送aaabbb 给服务器,服务器的协议栈里的数据是aaabbb, 但是由于多线程recv的原因,那么就导致:

线城1取出的数据 aabb

线城2的数据是ab

所以最终乱序。

请问我改如何?

...全文
156 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-02-22
  • 打赏
  • 举报
回复
不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊! http://bbs.csdn.net/topics/380167545
ArthurKingYs 2016-02-21
  • 打赏
  • 举报
回复
一个客户端就开启一个线程 不会有问题,你这个情况也不叫粘包
版主大哥 2016-02-21
  • 打赏
  • 举报
回复
其实socket也是系统的资源,那么你知道多个线程同时操作系统的同个资源要怎么做吗?1、使用锁 2、逻辑上保证
苦逼码农 2016-02-21
  • 打赏
  • 举报
回复
引用 8 楼 xihu1364 的回复:
楼主没理解投递recv请求,和得到recv完成通知吧。 如果只投递一次,得到完成通知后,将收到的数据放到对应socket的buf中,继续投递recv请求....
你说的是我在6楼的第2点, 你仍然没有 直接明了的 解答我的第1点,如何避免 多个线程对同一个socke操作 我一直在追问,难道是通过 线程同步手段来锁住同一个socket吗? 如果线程1 在对客户端a的socket 在操作之前,是不是要判断, 没有人对该socke进行操作, 如果有的话,就不要操作该socket!!!!!
版主大哥 2016-02-19
  • 打赏
  • 举报
回复
就算你对同1个socket投递了多次,对应recv的线程被唤醒也是有先后顺序的。 所以可以对这个被唤醒的先后顺序进行粘包
版主大哥 2016-02-19
  • 打赏
  • 举报
回复
高手们都提到一句话————————“不要对同一个socket,同时wsasend, wsarecv"即可。 ---------应该是对一个socket只投递一次,就不会出现多个线程recv了。
苦逼码农 2016-02-19
  • 打赏
  • 举报
回复
有人帮忙解答吗?
苦逼码农 2016-02-19
  • 打赏
  • 举报
回复
版主大哥 2016-02-19
  • 打赏
  • 举报
回复
楼主没理解投递recv请求,和得到recv完成通知吧。
如果只投递一次,得到完成通知后,将收到的数据放到对应socket的buf中,继续投递recv请求....
void_main_void 2016-02-19
  • 打赏
  • 举报
回复
传送结构体, struct int WCHAR[256] 每次服务器读取就读一个结构体就好
苦逼码农 2016-02-19
  • 打赏
  • 举报
回复
引用 5 楼 VisualEleven 的回复:
要尽量避免多个线程同时读写一个socket。
引用 4 楼 xihu1364 的回复:
就算你对同1个socket投递了多次,对应recv的线程被唤醒也是有先后顺序的。 所以可以对这个被唤醒的先后顺序进行粘包
比如服务器创建了2个线程, 线程函数大概如下: //wsarecv //wsasend 要尽量避免多个线程同时读写一个socket。 两个线程,但是线程函数,这个函数的代码一样, 这个2个线程在执行的时候,线程1在操作 客户端a 的socket, 如何保证让线程2不要操作这个socket? 通过 互斥体,event 等来调度? 以上是第一点, 第二点: 第一次是线程1接受客户端a的数据,下一次iocp调度,变成了线程2接受客户端a的数据, 是不是就意味着,我需要为每一个socket搞一个缓冲区,不管哪个线程接受到数据,就把数据存储 到该socket对应的用户缓冲区域, 这样就保证了 接受的数据不粘包!!! 一共2点,不对请指正,谢谢
Eleven 2016-02-19
  • 打赏
  • 举报
回复
要尽量避免多个线程同时读写一个socket。

16,470

社区成员

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

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

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