请问,在外网环境下,怎么判断非阻塞TCP接收数据完成?

gzshun 2013-07-24 04:41:43
请问,在外网环境下,怎么判断非阻塞TCP接收数据完成?
附加:
1.排除加标志和设置长度的方法。
2.经过测试,recv返回-1,errno为EAGAIN的结果,并不是接收数据完成的情况。
...全文
221 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
gzshun 2013-07-26
  • 打赏
  • 举报
回复
谢谢各位朋友的回答。 自己的总结,不一定正确: 在外网环境下, 1.对于非阻塞TCP连接,TCP是基于流发送的,不能判断接收数据完成的情况。可以在应用层协议,增加长度或者加结束标志的方法,来达到想要的结果。 2.对于阻塞/非阻塞UDP连接,根据网上的搜索得到此结果,若能接收到UDP数据(包长度最好<=512字节),那么肯定是完整的数据,否则就丢包。
zilaishuichina 2013-07-25
  • 打赏
  • 举报
回复
加标志或标记长度 就是最好的办法 ip协议,TCP协议,UDP协议 他们自身都是在协议头部设计了一个字段来表示长度 如果还有更好的办法 那设计这些协议的人他们自己为什么不用呢
max_min_ 2013-07-25
  • 打赏
  • 举报
回复
rrno=EAGAIN表示的是你的write本来是非阻塞情况,现在没有数据可读,这个时候就会置全局变量errno为EAGINA,表示可以再次进行读操作。 如果不能加一个定长来说明 接收数据完成, 那就只能在数据段中加一个 特殊定的字符,当接收到这个字符的时候表示接收数据完成啦! 断开连接!
nice_cxf 2013-07-25
  • 打赏
  • 举报
回复
tcp是基于流的,哪来的什么接收结束?比如发送123456一个包可能接收是12,34,56三个包,你怎么判断是否结束?
gzshun 2013-07-25
  • 打赏
  • 举报
回复
引用 3 楼 gpshq 的回复:
TCP的FIN?
?什么意思
gzshun 2013-07-25
  • 打赏
  • 举报
回复
引用 2 楼 songsong33 的回复:
client端发送完数据close socket,server端根据socket close事件来判断是否完成。 这样如果client异常断开的话,判断失效;所以最好的方式还真是 附加1 提到的方式。
我使用的连接不能马上关闭,后面还会使用到。
hzhxxx 2013-07-25
  • 打赏
  • 举报
回复
数据收不收完整,是协议来判断的。 通讯和协议是分开设计的。 通讯负责传输链路 协议负责数据组装。 包完整不完整,把二进制数据,按你的设计协议来解析,能解析成功,符合你的预期就完整。
gzshun 2013-07-25
  • 打赏
  • 举报
回复
引用 7 楼 zilaishuichina 的回复:
加标志或标记长度 就是最好的办法 ip协议,TCP协议,UDP协议 他们自身都是在协议头部设计了一个字段来表示长度 如果还有更好的办法 那设计这些协议的人他们自己为什么不用呢
嗯,谢谢zilaishuichina,看来只能用这2种办法。
氰客 2013-07-24
  • 打赏
  • 举报
回复
TCP的FIN?
  • 打赏
  • 举报
回复
client端发送完数据close socket,server端根据socket close事件来判断是否完成。 这样如果client异常断开的话,判断失效;所以最好的方式还真是 附加1 提到的方式。
gzshun 2013-07-24
  • 打赏
  • 举报
回复
各位达人,求指教。

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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