和TCP套接字一樣,UDP套接字也通過(guò)socket( )函數(shù)創(chuàng)建,不同的是UDP套接字可以通過(guò)一個(gè)套接字描述符在不同的主機(jī)之間發(fā)送和接收?qǐng)?bào)文。
創(chuàng)建UDP客戶端的典型過(guò)程為:首先調(diào)用socket( )函數(shù),接下來(lái)定義發(fā)送和接收數(shù)據(jù)的遠(yuǎn)程主機(jī)和端口,然后將套接字傳遞給connect( )函數(shù)。套接字描述符在后面會(huì)用于發(fā)送和接收數(shù)據(jù)。除此之外,發(fā)送數(shù)據(jù)的目標(biāo)主機(jī)和端口可以在數(shù)據(jù)“寫入”時(shí)指定,這樣就可以用一個(gè)套接字發(fā)送數(shù)據(jù)到多個(gè)主機(jī)。
UDP數(shù)據(jù)報(bào)的發(fā)送可以使用write( )、send( )或sendto( )函數(shù)。如果使用write( )或send( ),則必須事先以UDP套接字為參數(shù)調(diào)用connect( )函數(shù),此外,如果使用sendto( )函數(shù)則可以在發(fā)送數(shù)據(jù)時(shí)再指定目標(biāo)地址及端口。接收UDP數(shù)據(jù)報(bào)可以使用read( )、recv( )或recvfrom( )函數(shù)。如果使用read( )或recv( ),則必須事先調(diào)用connect( )函數(shù);如果使用recvfrom( ),則可以在接收數(shù)據(jù)報(bào)時(shí)獲得源IP地址和端口。
與TCP不同的是,在UDP套接字上收發(fā)的數(shù)據(jù)是作為單獨(dú)的單元接收或發(fā)送的,而不是作為字節(jié)流。每次調(diào)用write( )、send( )、或sendto( )函數(shù)都會(huì)在線路上產(chǎn)生一個(gè)UDP數(shù)據(jù)報(bào)。接收到的UDP數(shù)據(jù)報(bào)的讀取也是一個(gè)單獨(dú)的操作,如果讀取報(bào)文時(shí)提供的緩沖區(qū)長(zhǎng)度不夠,則會(huì)返回一個(gè)出錯(cuò)代碼。
如果UDP數(shù)據(jù)報(bào)的長(zhǎng)度超出了本地或者任意一個(gè)必經(jīng)的網(wǎng)絡(luò)上的最大片長(zhǎng)度,則必須進(jìn)行分段,這在性能上會(huì)有不良影響,因此有些操作系統(tǒng)對(duì)此做了限制或者不予支持。