zoukankan      html  css  js  c++  java
  • socket通信如何处理每次包长度不定问题

    说起来,这是一个漫长的问题:

    客户端和服务器通信的结构是:包头+数据长度+数据

    客户端请求服务器发送200包数据。包头=request;长度=4(一个int),数据=200;

    服务器在收到客户端的请求后,在while循环里面不停的send,直到够200包:包头=indicate 长度=XX,后面跟一大串数据;发完以后,再发一个结束的包:包头=end,长度-1,data=无效值。

    在服务器端,在while循环里不停的recv:先recv包头,在recv长度。如果判断是数据,然后recv数据。如果判断是结束包,那么break出循环。

    这个看似没有问题的程序,实际存在一个问题:

    在客户端,recv包头和长度后,recv数据,可能出现数据并没有全部传过来的情况,比如recv长度后,得知后面的数据有15000字节。但是由于阻塞等原因,只传过来了7000字节。那么按照原来程序的逻辑,就会在下一次recv包头和长度时,将实际发送的剩下的8000字节当做新一包的包头,然后解包,这样就出现了错误。

    我的处理办法是,如果recv数据时,实际收到的长度不等于发送数据长度,那么就搞一个小的while循环,在循环中把这一包收满(为了保证收满,可以sleep(10)),然后跳出来,继续收下一包,就解决了。

    这个办法是很土,但是由于每包的长度不定,所以暂时只能想到这个办法解决。

  • 相关阅读:
    阅读 video in to axi4-stream v4.0 笔记
    python 字符串操作
    python 基本语句
    Python 算术运算符
    芯片企业研报阅读
    量化分析v1
    基于MATLAB System Generator 搭建Display Enhancement模型
    System Generator 生成IP核在Vivado中进行调用
    FPGA 中三角函数的实现
    System Generator 使用离散资源
  • 原文地址:https://www.cnblogs.com/ganchuanpu/p/10472015.html
Copyright © 2011-2022 走看看