文档章节

socket的缓冲区问题

 燕燕燕燕纸
发布于 2015/12/31 14:44
字数 709
阅读 77
收藏 0

由于是第一次用socket编程写即时通讯,遇到的问题还真不少。最近又遇到一个奇葩的问题:对于文本信息,我的发送按钮似乎不太听使唤。消息编辑好了,点击一次send发送消息,但收不到服务器返回的数据,聊天界面上没有显示聊天消息。这下我就纳闷了,在没有用socket编程之前,我的发送按钮确实没问题,可以把textfield上编辑的信息显示到聊天界面上。然后,我把文本框的消息不删除,消息编辑,再点击一次send发送消息,没收到数据,多点击几次按钮,有反应了,发现点击两次才能接收数据成功,或者距离上一次发送的时间间隔小一点也能接收。

        设置断点调试,发送给服务器没有问题,但是服务器返回来的数据时而能收到时而不能收到。后来goole,问大神,终于找到问题所在--延迟。

       "粘包"可发生在发送端也可发生在接收端.

1.由Nagle算法造成的发送端的粘包:默认情况下,发送数据采用Negale算法。Nagle算法是一种改善网络传输效率的算法。简单的说,当我们提交一段数据给TCP发送时,TCP并不立刻发送此段数据,而是等待一小段时间,看看在等待期间是否还有要发送的数据,若有则会一次把这两段数据发送出去。
2.接收端接收不及时造成的接收端粘包:TCP会把接收到的数据存在自己的缓冲区中,然后通知应用层取数据。当应用层由于某些原因不能及时的把TCP的数据取出来,就会造成TCP缓冲区中存放了几段数据

        在实际情况下,如果在聊天中用户每次敲几个字节的消息,而下层在攒这些数据,想等到数据量多了再发送,这样用户会等到发疯。

        socket有两个选项: TCP_CORK和TCP_NODELAY TCP_CORK是尽量向缓冲区存放数据,等存放的多了再发送,而TCP_NODELAY则是不等待,只要缓冲区里有数据,就发送出去。默认情况下是TCP_CORK。知道了这个,我们就可以解决了,在程序中设置“发送不延迟”,就不存在粘包的问题了。

具体方法:在连接服务器那里,设置发送不延迟

再加上两个头文件,

#import <netinet/tcp.h>

#import <netinet/in.h>

OK,解决。关于socket我还在继续学习当中,写的不好之处,还望大家指出,谢谢!





© 著作权归作者所有

粉丝 1
博文 2
码字总数 1247
作品 0
长沙
私信 提问
linux epoll 开发指南-【ffrpc源码解析】

摘要 关于epoll的问题很早就像写文章讲讲自己的看法,但是由于ffrpc一直没有完工,所以也就拖下来了。Epoll主要在服务器编程中使用,本文主要探讨服务器程序中epoll的使用技巧。Epoll一般和异...

知然
2013/12/17
0
0
tcp协议数据传输“粘包”分析

这两天看csdn有一些关于socket粘包,socket缓冲区设置的问题,发现自己不是很清楚,所以查资料了解记录一下: 一 .两个简单概念长连接与短连接: 1.长连接 Client方与Server方先建立通讯连接...

长平狐
2013/12/25
2.2K
0
【分布式专题】-- 分布式基石(TCP/IP通信协议)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/YYZZHC999/article/details/87974772 http请求,在整个网络各层的请求过程: 当应用程序通过TCP传输数据,数据...

杨晓慧_Hepburn
02/27
0
0
Netty学习笔记1:5种IO模型

1 阻塞IO模型 从字面来理解,就是调用时可能被阻塞,什么叫阻塞,要知道一个进程有N种状态,学过OS都知道如果阻塞,就会把当前进程放在某个条件的阻塞队列里。直到条件满足了,才会转移此进程...

强子哥哥
2014/07/19
1K
8
分布式系统的基石TCP协议笔记

发送消息 接收消息 为什么有了MAC 层还要走IP 层呢? mac 地址就好像个人的身份证号,但是和人所在的位置没有关系 所以要实现机器之间的通信,还需要有ip 地址的概念,ip 地址表达的是当前机...

Java搬砖工程师
2018/11/08
29
0

没有更多内容

加载失败,请刷新页面

加载更多

PhotoShop 色调:理解直方图/RGB通道信息

一、直方图:图表的形式,展示图像像素分布的情况 1.平均值:表示平均亮度 2.标准偏差值:表示亮度值范围内的中间值 3.像素: 表示用于计算直方图的像素总数 4.色阶:显示指针下面的区域亮度...

东方墨天
17分钟前
5
0
wildfly(JBoss AS)应用服务器快速入门

什么是wildfly JBoss AS 从8版本起名为wildfly。Wildfly是一个开源的基于JavaEE的轻量级应用服务器。可以在任何商业应用中免费使用。 WildFly是一个灵活的、轻量的、强大管理能力的应用程序服...

程序新视界
42分钟前
3
0
Java集合类常见面试知识点总结

Java集合类学习总结 这篇总结是基于之前博客内容的一个整理和回顾。 这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 https://blog.csdn.net/column/details/21930...

Java技术江湖
45分钟前
6
0
怎么用for循环打出爱心

先上效果图: 这是用*组成的爱心,下面讲讲思路: 首先这个图形可以拆分成三部分:第一部分是上面三行的两个梯形,第二部分是中间三行的长方形,第三部分是最下面的倒三角形。 其实图形拆分好...

INEVITABLE
50分钟前
4
0
用HttpUrlConnection伪造成HttpClient

https://www.jianshu.com/p/27ad06cc39d2

shzwork
56分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部