对于linux网络编程,UDP协议不是面向连接的协议,直接把数据报发送到链路层,至于能不能到达目的IP和端口,它不关注;大部分时候再编写代码时候只需要在sendto函数中指定你要发送的端口和IP地址就可以了,不用绑定IP和端口。不过你是否考虑过,UDP到底是否可以进行connect,如果对UDP进行connect函数的调用,会发生什么现象呢?
在进行socket网络编程代码编写时,我个人觉得有如下三个步骤在客户端和服务端是一致的,只是触发的时机不同。
- socket创建通信套接口句柄(fd)---------------创建插座(抽象比喻)
- bind绑定本地的IP和端口到句柄--------------在插座的后面连接上电源线
- connect连接远端的IP和端口号到句柄,建立数据交换线路------------在插座的前面连接上使用者
以上三个步骤在TCP协议通信中client是必须存在,但是UDP协议中,可能针对connect看到的不多。
依据上面的说明,UDP可以分为如下两种:
- 未连接的UDP,新创建的UDP套接字。
- 已连接的UDP,调用connect就会这样。
比较1/2两种UDP,已经连接的UDP有如下特性:
- 不需要给输出操作指定目的IP和目的端口,写到UDP的缓冲区里的数据,将自动发送到你调用connect指定的IP和端口。
- 在一个已连接的UDP套接字上,内核由输入操作返回的数据报只有那些来自connect所指定的协议地址的数据报。目的地为这个已连接的UDP套接字的本地协议地址(IP和端口),远端地址不是该套接字早先connect到的协议地址的数据报,不会投递到该套接字。这样就限制了已连接的UDP套接字能且只能与一个对端交换数据报。
- 由已连接的套接字引发的异步错误发回给他们所在的进程,而未连接的UDP套接字不接受任何异步错误。
- 读写的操作接口方法增多了,除了可以使用sendto和recvfrom的接口外,还可以使用tcp的那套操作接口--read/readv/readmsg和write/writev等
对一个UDP的套接口多次调用connect的情况如何&#