Aaron学习笔记
少壮不努力,长大没饭吃!
posts - 4, comments - 13, trackbacks - 0, articles - 37
导航
C++博客
首页
新随笔
联系
聚合
管理
<
2024年12月
>
日
一
二
三
四
五
六
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
留言簿
(2)
给我留言
查看公开留言
查看私人留言
随笔档案
(4)
2009年5月 (2)
2009年4月 (2)
文章分类
(36)
C++学习(1)
C和指针(6)
JAVA基础(5)
Linux编程(7)
日常练习(10)
算法设计与分析(7)
文章档案
(37)
2011年7月 (1)
2011年6月 (3)
2011年5月 (1)
2011年4月 (2)
2010年9月 (1)
2010年8月 (4)
2010年7月 (1)
2009年9月 (2)
2009年8月 (1)
2009年7月 (2)
2009年5月 (2)
2009年4月 (3)
2009年3月 (10)
2009年1月 (4)
常去的网站
CSDN论坛
网易论坛
积分与排名
积分 - 66255
排名 - 341
最新随笔
1. 怎么说呢,哎
2. 郁闷,今天没有进展
3. 早起签个名
4. 每天都获得一点小进步
最新评论
1. re: 判断一个IP地址是不是合法
评论内容较长,点击标题查看
--yueyongqiang
2. re: Java中的内部类
很不错,学习了!
--clytze
3. re: 删除字符串中的一部分
没人发现这代码是不对的吗???
--tian
4. re: 字符串查找
不是很理解上方代码,貌似代码要求是查找字符串 但是上面只实现了对字符串的首字符进行匹配的工作
--lost-angel
5. re: 判断一个IP地址是不是合法
109.66.2.1
--fiona
阅读排行榜
1. 怎么说呢,哎(381)
2. 每天都获得一点小进步(349)
3. 郁闷,今天没有进展(333)
4. 早起签个名(320)
评论排行榜
1. 怎么说呢,哎(1)
2. 每天都获得一点小进步(0)
3. 早起签个名(0)
4. 郁闷,今天没有进展(0)
数据报和字节流在使用时的一些区别
Posted on 2011-07-12 15:02
赞劲小子
阅读(4145)
评论(0)
编辑
收藏
引用
所属分类:
Linux编程
众所周知,TCP是面向字节流的协议,而UDP是面向数据报的,我一直不是很明白这两者之间的关系,今天写了个小程序才发现了这个问题。
本来是想测试一下select是不是阻塞的,也就是说看看select在其中的某个描述符可用,并且正进行处理时,如果又有描述符活动,select会不会丢失一些数据
问个问题:使用select做tcp和udp的客户端,想看一下如果select后处理的时间较长,那这段时间里面描述符的改变会不会被收到!
tcp server:
result
=
select(..);
-
1
:
0
:
else
{
if
(FD_ISET(sockfd,
&
readfd))
{
recvfrom()..
printf();
sleep(
3
);
}
}
tcp client:
while
(
1
)
{
不停的发送数据; 数据为:qwer
sleep(
1
);
}
tcp的这个程序运行时,client:1111、1111、1111、1111、1111、1111、1111、1111、1111。1111是每次send完成后printf的一条输出,隔一秒发送一条
server:qwer/qwerqwer/qwerqwerqwer/qwerqwerqwer/ 后面都是三个一次 server是sockfd有数据时,取一次数据,但是sleep(3)。
TCP的这个程序发现即使select延时了,数据也没有丢失,我想应该是select内核中会有一个缓冲或者队列之类的保存下了sockfd有活动来的这个状态
程序改为udp时,输出是:qwer/qwer/qwer/qwer/qwer/....也没有丢失数据,但是每次只输出一串"qwer"
这是这个程序中,tcp服务器和udp服务器的最显著的区别了,为什么呢?求助后,tcp是基于字节流的,没有边界,udp是数据报,每个包之间有边界。
“TCP 是一个面向字节流的协议”指的是数据是作为字节流提交给接受方的,没有什么内在的消息和消息边界的赶来。在读取数据的时候用户也不知道一个给定的的读调用将会返回多少字节。面向无连接,是指每一个数据包和另外的数据包都是独立地处理,而面向连接的协议,状态信息是由协议负责维护与实现的。 无连接的每个数据包通常称为 数据报(Datagram),而面向连接的是字节流。
所谓面向字节流就是“字节就是字节”,也就是说对TCP协议而言,字节没有特别含义,一律平等。所有字节的含义只有应用知道,所以TCP里也就没有message边界,收发双方的发送和接收次数也不一定相同。
http:
//
topic.csdn.net/t/20040408/00/2938561.html
QQ上问的
-
]
14
:
34
:
21
嗯
-
]
14
:
34
:
42
udp是一个包发送的
飛雪一刀
14
:
34
:
44
为什么呢?
-
]
14
:
34
:
46
tcp是流
飛雪一刀
14
:
34
:
53
这就是字节流和数据包的区别么?
飛雪一刀
14
:
34
:
57
报
-
]
14
:
35
:
22
tcp一帧数据可以分多个包发
飛雪一刀
14
:
35
:
57
是否分不确定是吧?
-
]
14
:
36
:
13
udp一包就一帧数据,但是每包数据最好不能大于1024
-
]
14
:
36
:
20
tcp自己处理
-
]
14
:
36
:
41
udp没有重传,丢了就丢了
飛雪一刀
14
:
36
:
52
是不是说套接口缓冲区中如果有数据,并且recv()的length能够装下的话,不管是分几次发送的,都会接受
飛雪一刀
14
:
37
:
31
而udp的每个包之间有识别
-
]
14
:
37
:
32
tcp是自己分包
-
]
14
:
37
:
51
udp人为分包
飛雪一刀
14
:
37
:
53
是发送的时候分包还是接收的时候呢?
飛雪一刀
14
:
37
:
56
tcp的话
-
]
14
:
38
:
14
按照发的顺序接受
-
]
14
:
38
:
43
在接受一方要自己按格式组成一个完整的帧
飛雪一刀
14
:
38
:
46
我tcp发送的时候qwer字符串是分多次发送的,每次间隔一秒
飛雪一刀
14
:
39
:
13
但tcp服务器好像一下就把3次的数据都接收了
-
]
14
:
39
:
36
操作系统内核有一个buf
-
]
14
:
40
:
13
都放在这个buf中
飛雪一刀
14
:
40
:
47
恩,udp的数据也是存档在buf中啊
-
]
14
:
41
:
20
那是操作系统控制的
飛雪一刀
14
:
41
:
22
服务端读取的时候是一个包一个包取得吧?包就是每次sendto就一个包吧?
-
](
14
:
41
:
49
嗯
飛雪一刀
14
:
42
:
29
哦,谢谢啊
只有注册用户
登录
后才能发表评论。
【推荐】100%开源!大型工业跨平台软件C++源码提供,建模,组态!
相关文章:
数据报和字节流在使用时的一些区别
Makefile的multiple definition of错误
系统V共享内存过程中须注意问题
Ubuntu文件目录的不同颜色代表什么意思
.关于硬链接和软连接(符号链接)的区别
perror函数,strerror函数,errno
stdin和STDIN_FILENO区别
网站导航:
博客园
IT新闻
BlogJava
博问
Chat2DB
管理
Powered by:
C++博客
Copyright © 赞劲小子