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