天天看點

《UNIX網絡程式設計 卷1:套接字聯網API(第3版)》——8.2 recvfrom和sendto函數

本節書摘來自異步社群《unix網絡程式設計 卷1:套接字聯網api(第3版)》一書中的第8章,第8.2節,作者:【美】w. richard stevens , bill fenner , andrew m. rudoff著,更多章節内容可以通路雲栖社群“異步社群”公衆号檢視

這兩個函數類似于标準的read和write函數,不過需要三個額外的參數。

前三個參數sockfd、buff和nbytes等同于read和write函數的三個參數:描述符、指向讀入或寫出緩沖區的指針和讀寫位元組數。

flags參數将在第14章中讨論recv、send、recvmsg和sendmsg等函數時再介紹,本章中重寫簡單的udp回射客戶/伺服器程式用不着它們。時下我們總是把flags置為0。

sendto的to參數指向一個含有資料報接收者的協定位址(例如ip位址及端口号)的套接字位址結構,其大小由addrlen參數指定。recvfrom的from參數指向一個将由該函數在傳回時填寫資料報發送者的協定位址的套接字位址結構,而在該套接字位址結構中填寫的位元組數則放在addrlen參數所指的整數中傳回給調用者。注意,sendto的最後一個參數是一個整數值,而recvfrom的最後一個參數是一個指向整數值的指針(即值-結果參數)。

recvfrom的最後兩個參數類似于accept的最後兩個參數:傳回時其中套接字位址結構的内容告訴我們是誰發送了資料報(udp情況下)或是誰發起了連接配接(tcp情況下)。sendto的最後兩個參數類似于connect的最後兩個參數:調用時其中套接字位址結構被我們填入資料報将發往(udp情況下)或與之建立連接配接(tcp情況下)的協定位址。

這兩個函數都把所讀寫資料的長度作為函數傳回值。在recvfrom使用資料報協定的典型用途中,傳回值就是所接收資料報中的使用者資料量。

寫一個長度為0的資料報是可行的。在udp情況下,這會形成一個隻包含一個ip首部(對于ipv4通常為20個位元組,對于ipv6通常為40個位元組)和一個8位元組udp首部而沒有資料的ip資料報。這也意味着對于資料報協定,recvfrom傳回0值是可接受的:它并不像tcp套接字上read傳回0值那樣表示對端已關閉連接配接。既然udp是無連接配接的,是以也就沒有諸如關閉一個udp連接配接之類事情。

如果recvfrom的from參數是一個空指針,那麼相應的長度參數(addrlen)也必須是一個空指針,表示我們并不關心資料發送者的協定位址。

recvfrom和sendto都可以用于tcp,盡管通常沒有理由這樣做。

繼續閱讀