Aaron学习笔记

少壮不努力,长大没饭吃!
posts - 4, comments - 13, trackbacks - 0, articles - 37
众所周知,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
哦,谢谢啊

 



只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理