求SOCKET的一个问题

emyueguang 2009-10-10 01:53:51
过程如下:
服务器开启监听,客户端链接到服务器,但是服务器不会立刻分配任务给客户来做,可能要过很长时间,但是又不允许服务器与客户端的SOCKET断开,客户端开一个线程向服务器发送心跳数据,服务器也开一个线程接收这个心跳数据,等到服务器向客户端分配任务的时候就关掉这个线程,然后向客户端发送数据,在客户端,收到服务器的数据(服务器如果发给客户端数据就表示要处理的数据),也会停止发送心跳的线程,这个时候客户端停止了心跳包发送线程了,服务器端也停止了接收心跳包的线程了,客户端处理服务器的数据,然后将处理之后的数据发送到服务器,收发心跳包的过程是很稳定的,问题就出现在,在客户端与服务器链接很长时间之后(也就是说客户端向服务器发送了大量的心跳数据),再将处理之后的数据发送到服务器的时候,服务器接收的数据就是心跳数据,而不是要处理的数据,这是为什么呢?之前的心跳数据我已经开了一个线程来接收了啊,为什么还有大量的心跳数据发来呢,(确定发送心跳数据的线程只有一个,而且在接收到服务器的数据之后已经将这个线程关了)
我想这个可能与TCP协议栈有关,关于再深一点东西,我了解的不是很多,还请各位高手指点一二,上面都是项目要求那样做的,所以不要问为什么要那样做而不那样做~~
...全文
114 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
emyueguang 2009-10-10
  • 打赏
  • 举报
回复
心跳包的数据我定义的是一个字节的buffer,5秒发一次,而客户端处理服务器的时间2秒之内就可以搞定并回发数据,服务器端将数据发送出去之后收的时候就收到大量的心跳数据,时间越长,收到的心跳数据越多,即客户给的真正的处理过的数据就会积压在后面,而服务器的接收缓冲大小是有限的,而且我试了,在服务器端循环的接收数据(我就不信收不完心跳包)结果会收N多次心跳包之后才收到真正想要的数据,这个在性能上不符合要求
  • 打赏
  • 举报
回复
之前的心跳数据我已经开了一个线程来接收了啊,为什么还有大量的心跳数据发来呢,(确定发送心跳数据的线程只有一个,而且在接收到服务器的数据之后已经将这个线程关了)
我想这个可能与TCP协议栈有关,关于再深一点东西,我了解的不是很多,还请各位高手指点一二,上面都是项目要求那样做的,所以不要问为什么要那样做而不那样做~~


TCP是数据流,应该是你之前心跳包发送在接收方缓冲区积累过多,不管你换操作此连接,都是接收同一个连接的缓冲区,你可以在切换之后,先把积压的心跳数据读完看看啊。
pcboyxhy 2009-10-10
  • 打赏
  • 举报
回复
服务端停止接收的时候,客户端心跳还在继续,这里有短暂时间差

服务器停止接收到客户端停止心跳数据发送之间
大海啊全是水 2009-10-10
  • 打赏
  • 举报
回复
和TCP协议栈什么东西没有关系
你每个心跳包都加个序列号 调试一下 看看 客户端发了多少心跳包 服务器接收了多少个. 问题就会出来了
wendll 2009-10-10
  • 打赏
  • 举报
回复
看起来这问题是和缓冲区有关
但是楼主有说:收发心跳包的过程是很稳定的,问题就出现在,在客户端与服务器链接很长时间之后(也就是说客户端向服务器发送了大量的心跳数据)。
不是高速率发包,缓冲区应该不会积压包吧。楼主可以分别在服务器和客户端统计发送/接收心跳数据的次数,看能否找到问题症结所在
野男孩 2009-10-10
  • 打赏
  • 举报
回复
心跳包发送太多了,积压在系统中,尽管关了发送线程,完全可能数据还是没发送完,所以服务端再接收数据时先收到了心跳数据,但是后面应该还是会收到业务数据的。
捧剑者 2009-10-10
  • 打赏
  • 举报
回复
tcp缓冲区满了的时候,client的数据才会真正发出。
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 emyueguang 的回复:]
心跳包的数据我定义的是一个字节的buffer,5秒发一次,而客户端处理服务器的时间2秒之内就可以搞定并回发数据,服务器端将数据发送出去之后收的时候就收到大量的心跳数据,时间越长,收到的心跳数据越多,即客户给的真正的处理过的数据就会积压在后面,而服务器的接收缓冲大小是有限的,而且我试了,在服务器端循环的接收数据(我就不信收不完心跳包)结果会收N多次心跳包之后才收到真正想要的数据,这个在性能上不符合要¡­
[/Quote]

那你就得研究,你的心跳数据为何会积压啊。是服务器接收代码的问题不.

64,682

社区成员

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

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