当前位置:  技术问答>linux和unix

深入了解Linux系统TCP通信的高手请帮帮忙:Linux通信问题.分不够再加

    来源: 互联网  发布时间:2015-11-07

    本文导语:  我做一个通信中间件.客户端程序使用TCP/IP连接和它在一台计算机上的这个中间件.然后在通过这个中间件与另一台计算机上的中间件进行通信. CLIENT APP --->(TCP/IP)---->中间件1--->(TCP/IP)---->中间件2--->(TCP/IP)---->SERVER APP ...

我做一个通信中间件.客户端程序使用TCP/IP连接和它在一台计算机上的这个中间件.然后在通过这个中间件与另一台计算机上的中间件进行通信.
CLIENT APP --->(TCP/IP)---->中间件1--->(TCP/IP)---->中间件2--->(TCP/IP)---->SERVER APP
中间件1与CLIENT APP在一台计算机上.中间件2与SERVER APP在另一台计算机上.中间件是使用了多线程的.

我现在连续12次向中间件1发送数据.中间件1每收到一个数据我都先向中间件2发送.然后再向CLIENT APP返回应答信息,然后CLIENT APP再发第二次数据.这样反复12次.但现在有一个奇怪的问题.就是中间件1中的线程虽然是先向中间件2发送数据.但实质上没有发送出去的.可能是存放在了TCP的滑动窗口里面了.直到等到CLIENT APP的连续12个数据都向中间件1发送完毕后中间件1才向中间件2把滑动窗口里存储的数据一齐发送到中间件2.从中间件1发送最后一条数据开始记时到中间件2第一次收到数据截止花了20毫秒.正好是一个CPU时间片的时间.我也使用了TCP_NODELAY.但好象没有什么效果.

中间件1先向中间件2发送数据后,再向CLIENT APP发送应答信息.这时应该中间件2先收到信息,然后CLIENT APP再收到应答信息.即使是CLIENT APP先收到信息.也应该是中间件2与CLIENT APP交替收到信息.不会等到CLIENT APP都接收完毕中间件2那边才开始收.我即使使用不同的线程分别向两边发送也是一样的结果.是不是有什么TCP的属性没有设置?请高手指点.

|
用select来接收,还是阻塞在read?基本的代码结构能否写一下?

|
根据我片面的理解。TCP本来就是基于流的,只是在网络层折成包,它有发送缓冲区和接收缓冲区,一般情况下,只有发送缓冲区到达一定的量或超过预设的时间才开始发包,接收同样,否则的话,如果一个包只发几个字节,网络层和应用层每收一个包就通知一次不忙死(本来TCP协议在应用层就没有包的概念)。
如果你一定要强调应答的时间。用UDP比用TCP会好得多。因为UDP是基本包的。

|
这应该是典型的TCP粘包问题, CLIENT APP --->(TCP/IP)---->中间件1 之间的通讯是很快的, 所以中间件2收到的数据也很快, 所以你的SERVER并不是你的数据一到达就接收一次, 当他开始接收数据是, 中间件1的数据已经发送了很多次了, 所以就一次接收完了。 就是你设置了TCP的相关属性, 可能会好些, 但不能解决根本的问题! 如果你的每次数据都要分开接收, 建议你标识你每次发送的数据, 在SERVER端收到后解析, 就是你一次接收到12次的数据, 也没有问题的

|
一定是调度问题吗,是不是TCP滑动窗口的问题,换个思路测试一下,也许可以发现问题。

|
中间件是你自己做的吗?如果是3rd party的产品,估计中间件的实现上又缓冲的嫌疑(比如说缓冲到一定大小或延迟一定时间后再发送)。至于上面说的“TCP粘包”或OS 调度应该与你遇到的问题无关。

    
 
 

您可能感兴趣的文章:

  • 深入分析Visual C++进行串口通信编程的详解
  • 深入Android Handler与线程间通信ITC的详解
  • 深入理解Android组件间通信机制对面向对象特性的影响详解
  • 进程间通信之深入消息队列的详解
  • Android组件间通信--深入理解Intent与IntentFilter
  • 深入理解linux内核
  • Linux有没有什么好的高级的书,我要深入,
  • 想深入学习linux,请推荐一个版本的LINUX系统
  • 如何深入Linux的内核学习?
  • 想要深入学习LINUX该学什么?
  • 100分求:哪儿有《深入理解linux内核》可供下哉!
  • 前一阵子学习了shell脚本,如果想深入点了解linux可以看什么书呢
  • 各位,帮忙推荐几本深入学习Linux的书!!!
  • ##想买书深入学习linux下的编程,请指教
  • 哪儿有下载《深入理解Linux内核》这本书?(中文)
  • 有人读完《深入理解linux内核》吗?
  • 求一起看《深入理解linux内核》
  • 你学linux用的是什么书?请推荐一本你认为既能入门又能深入学习linux的书?跟贴有分.
  • 我是linux初学者,想一直深入到linux程序及内核的编程,请帮我规划一个书籍(资料)树
  • 初学者想深入学下LINUX,推荐点关于LINUX的书,谢谢
  • 以前是搞VC+socket的,现在转行到LINUX + c ,大家给推荐几本编程入门的书,稍微深入一些的也可以
  • 求一本電子書《深入分析Linux内核源码》
  • 求支持,深入理解LINUX内核
  • 深入解析Linux下MySQL数据库的备份与还原
  • 想深入学习linux下编程,请问在熟悉linux同时是不是应该好好找本书学c++?
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Docker支持更深入的容器日志分析
  • 关于《深入浅出MFC》
  • [100分]有没有关于binutils的深入的资料?或者深入底层的资料?
  • 深入理解PHP内核 TIPI
  • 想深入学习Java应该学习哪些东西
  • 哪位有《JSP深入编程》电子版?
  • U-BOOT得掌握到什么程序,用不用深入去学
  • 想深入了解操作系统该怎么做
  • 问一个《深入理解计算机系统》中的问题
  • 深入多线程之:深入分析Interlocked
  • 深入JDBC sqlserver连接写法的详解
  • 深入oracle特定信息排序的分析
  • 深入分析C中不安全的sprintf与strcpy
  • 请问JFC是否有必要深入研究?
  • 如何深入了解某个平台系统的底层
  • 如何深入了解线程
  • 深入理解Java对象实例生成的例子
  • 深入C++浮点数无效值定义与判定的解决办法
  • 深入理解计算机系统一书的一个问题
  • 深入UDP网络编程。
  • 深入mysql YEAR() MONTH() DAYOFMONTH()日期函数的详解


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3