和TCP套接字一样,UDP套接字也通过socket( )函数创建,不同的是UDP套接字可以通过一个套接字描述符在不同的主机之间发送和接收报文。
创建UDP客户端的典型过程为:首先调用socket( )函数,接下来定义发送和接收数据的远程主机和端口,然后将套接字传递给connect( )函数。套接字描述符在后面会用于发送和接收数据。除此之外,发送数据的目标主机和端口可以在数据“写入”时指定,这样就可以用一个套接字发送数据到多个主机。
UDP数据报的发送可以使用write( )、send( )或sendto( )函数。如果使用write( )或send( ),则必须事先以UDP套接字为参数调用connect( )函数,此外,如果使用sendto( )函数则可以在发送数据时再指定目标地址及端口。接收UDP数据报可以使用read( )、recv( )或recvfrom( )函数。如果使用read( )或recv( ),则必须事先调用connect( )函数;如果使用recvfrom( ),则可以在接收数据报时获得源IP地址和端口。
与TCP不同的是,在UDP套接字上收发的数据是作为单独的单元接收或发送的,而不是作为字节流。每次调用write( )、send( )、或sendto( )函数都会在线路上产生一个UDP数据报。接收到的UDP数据报的读取也是一个单独的操作,如果读取报文时提供的缓冲区长度不够,则会返回一个出错代码。
如果UDP数据报的长度超出了本地或者任意一个必经的网络上的最大片长度,则必须进行分段,这在性能上会有不良影响,因此有些操作系统对此做了限制或者不予支持。