wu

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
标准的udp客户端开了套接口后,一般使用sendto和recvfrom函数来发数据,实际上,udp发送数据有两种方法供大家选用的:
方法一: 
socket----->sendto()或recvfrom() 
方法二: 
socket----->connect()----->send()或recv().(此时sendto,recvfrom仍可用)
从定义可以看出,sendto和recvfrom在收发时指定地址,而send和recv则没有,那么他们的地址是在那里指定的呢,答案就在于connect函数。
在udp编程中,如果你只往一个地址发送,那么你可以使用send和recv,在使用它们之前用connect把它们的目的地址指定一下就可以了。connect函数在udp中就是这个作用,用它来检测udp端口的是否开放的、没有被使用的。
给UDP套接口调用connect,与TCP不同的是:没有三路握手过程。内核只是检查是否存在立即可知的错误(例如一个显然不可达的目的地),记录对端的IP地址和端口号(取自传递给connect的套接口地址结构),然后立即返回到调用进程
对于已连接UDP套接字,与缺省的未连接套接字相比,发生了以下变化:
1. 我们不必使用recvfrom以获悉数据报的发送者,而改用read,recv或recvmsg,在一个已连接UDP套接口上由内核为输入操作返回的数据 报仅仅是那些来自connect所指定协议地址的数据报。目的地为这个已连接UDP套接口的本地协议地址,发源地却不是该套接口早先connect到的协 议地址的数据报,不会投递到该套接口。这样就限制了一个已连接UDP套接口而且仅能与一个对端交换数据报。
2.由已连接的UDP套接口引发的异步错误返回给他们所在的进程。


UDP套接字多次调用connect可以为下列2个目的之一:
1.指定新的IP地址和端口号; 
2.断开套接口 
EXAMPLE:
server绑定172.25.40.206和10086端口,监听
Client调用Connect时,netstat结果:
udp        0      0 172.25.40.206:32862     172.25.40.206:10086     ESTABLISHED 
udp        0      0 172.25.40.206:10086     *:* 


Client没有Connect时:
udp        0      0 *:32862                 *:*                                 
udp        0      0 172.25.40.206:10086     *:* 

posted on 2012-03-20 18:52  butterflydog  阅读(320)  评论(0编辑  收藏  举报