Chinaunix首页 | 论坛 | 博客
  • 博客访问: 185175
  • 博文数量: 29
  • 博客积分: 2153
  • 博客等级: 大尉
  • 技术积分: 366
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-13 13:05
文章分类
文章存档

2015年(3)

2013年(2)

2012年(1)

2011年(5)

2010年(2)

2009年(3)

2008年(13)

分类: LINUX

2011-04-27 18:35:55

UDP是一个无连接的协议,因此socket函数connect()似乎对UDP是没有意义的,然而事实不是这样。它可以用来指定本地端口和本地地址,来建立虚拟连接。
 
一个socket接口有几个属性,其中包括协议,本地地址/端口,目的地址/端口。

    对于UDP来说:

    socket()函数建立一个插口;

    bind()函数指明了本地地址/端口(包括ADDR_ANY, 通配所有本地网络接口);

    connect()可以用来指明目的地址/端口

    一般来说,UDP客户端在建立了插口后会直接用sendto()函数发送数据,需要在sendto()函数的参数里指明目的地址/端口。如果一个UDP客户端在建立了插口后首先用connect()函数指明了目的地址/端口,然后也可以用send函数发送数据,因为此时send函数已经知道对方地址/端口,用getsockname()也可以得到这个信息。

    UDP客户端在建立了插口后会直接用sendto()函数发送数据,还隐含了一个操作,那就是在发送数据之前,UDP会首先为该插口选择一个独立的UDP端口(在1024—5000之间),将该插口置为已绑定状态。如果一个UDP客户端建立插口后首先用bind()函数指明了本地地址/端口,也是可以的,这样可以强迫UDP使用指定的端口发送数据。(事实上,UDP无所谓服务器和客户端,这里的界限已经模糊了。)

    UDP服务器也可以使用connect(),如上面所述,connect()可以用来指明目的地址/端口;这将导致服务器只接受特定一个主机的请求。

    方法一:

    socket()——>sendto()或recvfrom()

    方法二:

    socket()——>connect()——>send或recv()

阅读(5385) | 评论(0) | 转发(3) |
给主人留下些什么吧!~~