Arch manual pages

UDP(7) Linux 程序員手冊 UDP(7)

udp - IPv4 上面的 UDP 協議.

#include <sys/socket.h>
#include <netinet/in.h>
udp_socket = socket(PF_INET, SOCK_DGRAM, 0);

這是一個 RFC768 中的用戶數據報協議的實現. 它實現無連接的, 不可靠的數據報信息包服務. 信息包可能在它們傳輸到達之前重新排序或者重複. UDP 通過生成和檢查校驗和來俘獲傳輸錯誤.

當創建一個 UDP 套接字時, 它的本地和遠程地址是不確定的. 可以使用帶一個有效目的地址作爲參數的 sendto(2) 或者 sendmsg(2) 立即發送數據報.如果套接字上調用了 connect(2) 時, 則設置默認的目的地址, 數據報可以使用 send(2) 或者 write(2) 發送而不需要指定目的地址. 也可以通過傳遞一個地址給 sendto(2) 或者 sendmsg(2) 來發送到其它目的地址. 爲了接收信息包,套接字必須首先用 bind(2) 綁定一個本地地址, 如果沒有這麼做, 套接字層在第一個用戶接收請求時將自動分配一個本地端口.

所有接收操作只返回一個信息包. 當信息包小於所傳遞的緩衝區時, 則只返回那些數據, 當信息包大於所傳遞的緩衝區時,則截斷信息包並設置 MSG_TRUNC 標誌.

IP 選項可以使用描述於 ip(7) 中的套接字選項發送或接收. 只有打開了合適的 sysctl 時, 內核才處理它們(不過即使關閉了它們, 仍然會傳遞給用戶). 參見 ip(7).

如果設置了 MSG_DONTROUTE 標誌,則發送時目的地址必須指向一個本地接口地址, 而且信息包只發到該接口.

當 UDP 的總長超過接口 MTU(Maximum Transmission Unit 最大傳輸單元)時, UDP 會對信息包進行分段. 一個更爲網絡友好的可選方法是使用 path MTU discovery(路徑MTU發現), 它描述於 ip(7) 中的 IP_PMTU_DISCOVER 部分.

UDP 使用 IPv4 的 sockaddr_in 地址格式,其描述於 ip(7) 中.

所有重大錯誤都會以錯誤返回值的方式傳遞給用戶, 即使套接字沒有連接亦如此.這種處理方式有別於許多其它的 BSD 套接字實現方法, 除非套接字連接上, 否則那些方法不會傳遞任何錯誤, Linux 的處理方式遵循 RFC1122 的要求.

爲了與以前的代碼兼容,可以設置 SO_BSDCOMPAT SOL_SOCKET 選項令只在套接字已連接的情況下接收遠程錯誤( EPROTOEMSGSIZE) 除外. 最好是修復代碼並適當地處理錯誤, 而不要打開該選項. 本地產生的錯誤總是傳遞.

當打開了 IP_RECVERR 選項時, 所有錯誤可以存儲在套接字錯誤隊列中, 並可以通過帶 MSG_ERRQUEUE 標識設置的 recvmsg(2) 來接收.

所有列在 socket(7)ip(7) 中的錯誤都可以在一個 UDP 套接字上收發時收到.

ECONNREFUSED 沒有與目的地址相關聯的接收者. 這可能由於在前面一個通過該套接字發送的信息包而引發.

IP_RECVERR 是 Linux 2.2 中的新功能.

本手冊頁的作者爲 Andi Kleen.

ip(7), socket(7), raw(7).

RFC768: 用戶數據報協議.
RFC1122: 主機需求
RFC1191: 描述 path MTU discovery (路徑MTU查找).

riser <boomer@ccidnet.com>

2001/07/19

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
1998年10月2日 Linux 手冊頁