from:http://blog.csdn.net/zhengzhoudaxue2/article/details/6443743
对于linux网络编程,我们都知道UDP是发送数据报,不是面向连接的协议,也就是它只是把数据报发送到链路层,至于能不能到达目的IP和端口,他都无能为力了。而且,我们只要在sendto函数中指定你要发送的端口和IP地址就可以了,我们不用绑定端口和IP。
但是,如果对UDP进行connect函数的调用,会发生什么现象呢?
那么,connect函数是连接外部的IP和端口,一般我们是连接服务器的公共的端口和IP,但是,客户端也可以的!
有了这个能力,我们可以分为两个种:
1,未连接的UDP,新创建的UDP套接字就是这样的。
2,已连接的UDP,调用connect函数就是这样的。
其中,已连接的毕未连接的多了三个变化:
1,我们再也不能给输出操作指定目的IP和目的端口。也就是说,我们不能调用sendto,而是用write或者send。写到UDP的缓冲区里的数据,将自动发送到你调用connect指定的IP和端口。
2,我们不在是用recvfrom获得数据报的发送者,而改成了read,recv或者recvmsg。在一个已连接的套接字上,内核由输入操作返回的数据报只有那些来自connect所指定的协议地址的数据报。目的地为这个已连接的UDP套接字的本地协议地址(IP和端口),发源地却不是该套接字早先connect到得协议地址的数据报,不会投递到该套接字。这样就限制了已连接的UDP套接字能且只能与一个对端交换数据报。
3,由已连接的套接字引发的异步错误发回给他们所在的进程,而未连接的UDP套接字不接受任何异步错误。