V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
zaishanfeng
V2EX  ›  程序员

socket 中的粘包问题大家是怎么处理的?

  •  
  •   zaishanfeng · 2015-11-09 14:32:33 +08:00 · 3578 次点击
    这是一个创建于 3300 天前的主题,其中的信息可能已经有所发展或是发生改变。
    ryd994
        1
    ryd994  
       2015-11-09 14:57:47 +08:00
    一般不是带长度和 checksum 么?
    onlyyes2015
        2
    onlyyes2015  
       2015-11-09 19:10:52 +08:00
    面向字节流的 IO 都有这个问题。 socket 中 tcp 协议是面向流的协议,发送方发送和接收方的接收并不是一一对应的。所以造成所谓的粘包现象。
    怎么处理呢?
    方法 1 :协议包定长。
    每个发送出去的包长度固定。比如都是 10 个字节。收的时候每次就收 10 个字节,当一个完整的数据包。
    方法 2 :告知包的长度
    协议头开始固定长度的字节告知后续包长。收方先收包长字节,知道了后续包长后再收。
    方法 3 :用一个包体中绝不会出现的结束标志标识包结束。
    luent
        3
    luent  
       2015-11-09 19:14:20 +08:00
    我的处理方式根据数据的协议头和协议尾来判断消息,这样就是粘包,也没事,当你接收到协议尾来判断整个消息的完整性。粘包是由于发送缓冲区的大小大于需要发送的数据,数据等待达到缓冲区的大小的时候,数据再发送就造成了粘包,所以为了避免发生粘包,你发送完数据后,清空缓冲区,应该是可以解决,但是最好还是研究研究 tcp ,这样可以避免很多问题。
    pathletboy
        4
    pathletboy  
       2015-11-09 20:29:18 +08:00
    @luent 不光是发送,接收太慢,也会导致从系统缓冲区取出的数据粘包。

    一般来说,大部分 socket 通讯是靠协议解决的,常见的就是 命令字 包长 数据。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 20:01 · PVG 04:01 · LAX 12:01 · JFK 15:01
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.