* 小弟我做服务端, 由于没有约定 发送包的长度, recv数据时如何知道接收完毕返回呢? *

** 我做服务端, 由于没有约定 发送包的长度, recv数据时怎么知道接收完毕返回呢? ***

由于发过来的数据是不定长的,   我们双方也没有约定好,   所以没有在发数据包之前发送一个数据包的长度帧,   这种情况下该如何做?     我目前用的阻塞模式,   recv接收后,   总是不返回.

------解决方案--------------------
用非阻塞吧,只要有数据就接收,然后看数据是不是完整.
------解决方案--------------------
阻塞,不返回,和你说的数据包长度帧没有关系吧?

------解决方案--------------------
对于定长的协议。。先接收协议头。。根据此协议知道协议长度。。再接收相应的长度。。


但是最好的方法还是加上长度会好一点吧。。
------解决方案--------------------
1. 计算机是用来实现你的想法的,如果你想不通,就不可能实现。
2. 回答问题的人不可能还帮你考虑什么‘不是一个公司’的问题
------解决方案--------------------
协议控制报文大小。计算机不关心你的报文多少为结束。
------解决方案--------------------
最好确定通信协议,在协议中说明包的长度,否则不好控制。
------解决方案--------------------
to akirya(坏[其实偶不是什么所谓的坏人])
没有包长度怎么判断包是否完整?

to lzd(活着便精彩)
对于定长的协议。。先接收协议头。。根据此协议知道协议长度。。再接收相应的长度。。

应该改成 “对于变长的协议。。”吧,定长的协议还需要包长度干什么?

to lz
这种情况还是改变协议吧。

如果不改变协议可以让客户端在实现上 采用TCP_NODELAY选项关闭Nagle算法,并且两次发送之间加上sleep,你的发送代码同样结构

根本上还是需要加上包头控制信息(包长,包类型)+包体(传送内容)来解决,然后进行 拆包和组包
------解决方案--------------------
如果不改变协议可以让客户端在实现上 采用TCP_NODELAY选项关闭Nagle算法,并且两次发送之间加上sleep,你的发送代码同样结构

--------------
这种方法在实际应用中是行不同的,尤其在公网上传输数据的话,

如果没有指明数据长度的话,可以在发送数据的结尾加一个表示结尾的字符(如果你传输的是ASCII值的话),接受的时候检查这个字符,如果你发送的是二进制的数据,那应该只有改协议了
------解决方案--------------------
1、在收包的时候,一般都不知道长度
2、阻塞模式,在收到一个包后,返回。包的长度在ip头里有。recv不返回,可能是接收端窗口设置的问题。
------解决方案--------------------
to ringphone(临风)

没有应用层数据包分隔符或者包长度字段,如果进行数据解析?
--------------------------------
没有应用层数据包分隔符或者包长度字段就不能进行数据解析了?我给你发个字符串“Hello wo”,没有分隔符,没有包长度,你也能知道还有“rld\0”没有发过来。数据都是有意义和格式的,格式不完整,没有完整意思,就是数据没接收完。不是要你完整解析,只是通过解析来判断数据是否完整。如果严格规定数据中必须有分隔符,那只要查找接收到的数据中没有该分隔符,就能知道数据没有接收完毕。这种情况下,没有约定好数据长度字段,你就必须面对粘包问题。