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

《中國linux論壇man手冊頁翻譯計劃》:

http://cmpp.linuxforum.net

本頁面中文版由中文 man 手冊頁計劃提供。
中文 man 手冊頁計劃:https://github.com/man-pages-zh/manpages-zh

1998年10月2日 Linux 手冊頁