Chinaunix首页 | 论坛 | 博客
  • 博客访问: 3173489
  • 博文数量: 1805
  • 博客积分: 135
  • 博客等级: 入伍新兵
  • 技术积分: 3345
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-19 20:01
文章分类

全部博文(1805)

文章存档

2017年(19)

2016年(80)

2015年(341)

2014年(438)

2013年(349)

2012年(332)

2011年(248)

分类: LINUX

2014-03-31 19:42:57

原文地址:udp通信之流程2 作者:akls_21

UDP通信之流程2

流程:socket----->connect()----->send()或recv()
注意点:
1:UDP中可以使用connect系统调用
2:UDP中connect操作与TCP中connect操作有着本质区别.TCP中调用connect会引起三次握手,client与server建立连结.UDP中调用connect内核仅仅把对端ip&port记录下来.
3:UDP中可以多次调用connect,TCP只能调用一次connect.UDP多次调用connect有两种用途:1,指定一个新的ip&port连结.2,断开和之前的ip&port的连结.指定新连结,直接设置connect第二个参数即可.断开连结,需要将connect第二个参数中的sin_family设置成 
AF_UNSPEC即可.
 4:UDP中使用connect可以提高效率.原因如下:普通的UDP发送两个报文内核做了如下:#1:建立连结#2:发送报文#3:断开连结#4:建立连结#5:发送报文#6:断开连结采用connect方式的UDP发送两个报文内核如下处理:#1:建立连结#2:发送报文#3:发送报文另外一点,每次发送报文内核都由可能要做路由查询.
5:采用connect的UDP发送接受报文可以调用send,write和recv,read操作.当然也可以调用sendto,recvfrom.调用sendto的时候第五个参数必须是NULL,第六个参数是0.调用recvfrom,recv,read系统调用只能获取到先前connect的ip&port发送的报文. 

6:UDP中使用connect的好处:1:会提升效率.前面已经描述了.2:高并发服务中会增加系统稳定性.原因:假设client A 通过非connect的UDP与server B,C通信.B,C提供相同服务.为了负载均衡,我们让A与B,C交替通信.A 与 B通信IPa:PORTa <----> IPb:PORTbA 与 C通信IPa:PORTa' <---->IPc:PORTc 
假设PORTa 与 PORTa'相同了(在大并发情况下会发生这种情况),那么就有可能出现A等待B的报文,却收到了C的报文.导致收报错误.解决方法内就是采用connect的UDP通信方式.在A中创建两个udp,然后分别connect到B,C.
7、UDP中 ,长度为0的数据包是可以发送的,会生成一个包含IP头部(ipv4-20字节,ipv6-40字节),和8字节UDP头部,以及没有数据的 IP数据包,recvfrom返回0。
所以,当recvfrom返回0,并不意味着对方关闭了连接。实际上,UDP本来就没有连接可言。
8、TCP服务器一般是并发多进程的,UDP服务器一般是迭代的 。。除非套接口已连接,否则异步错误是不会返回到UDP套接口的,如果服务端进程未开启,那么客户端往其发送udp数据包时,会返回ICMP不可到达错误,但是这个错误一般不返回到客户端进程,因为ICMP不可到达错误 是异步错误,如果客户端发送多个UDP,其中一个返回错误,内核是无法判断这个错误属于哪个数据包的。
只有当客户端使用connect与服务端建立unp连接时,ICMP不可到达错误才会返还给客户端进程,具体地说是在客户端recv或者read时读取到 这个 ICMP错误。
阅读(2568) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~