TCP IP實現(九) 插口I O

2021-09-01 09:12:44 字數 1512 閱讀 7094

struct	sockbuf  so_rcv, so_snd;
注意,程序訪問套接字快取時是加鎖的,因此多個程序訪問套接字快取是安全的。

寫系統呼叫有write,writev,send,sendto,sendmsg,所有的這些系統呼叫都會都會直接或間接呼叫sosend函式,該函式會將程序傳來的資料複製到核心,並傳給與插口相關的協議。且前四個系統呼叫都可以用sendmsg函式來進行替換(但是只有前兩個函式呼叫可以作用於其它描述符,後三個只能用於介面描述符),因此,此處只對sendmsg函式進行說明。

sendmsg會間接呼叫sosend函式將資料交付給相應的協議層,當絕不將資料直接新增到套接字快取中,因為這是資料層該做的工作,比如udp就不會將資料放入快取。sosend函式首先會sblock函式獲取socket傳送快取的鎖,接著根據協議型別來進行不同的交付方式,對於有邊界的報文協議(如udp),必須等到有足夠的快取時,一次性拷貝到核心的儲存空間mbuf中,再交付給協議層,否則(如tcp),每次交付一部分資料(乙個mbuf)至協議層(只有當套接字快取可用空間高於低水位時才交付,否則等待套接字快取空閒)。當若設定了非阻塞模式,當空間不夠時,立刻返回ewouldblock(即eagain,請求資源不足)。對於邊界報文的協議而言,若一次性通過writev寫入的資料過大(查過了套接字結構中的高水位sb_hiwat),則也立刻返回emsgsize,因為對於資料報協議而言,呼叫一次writev就是傳送乙個資料報。

另外,sosend函式會首先檢查套接字是否被禁止(已關閉寫so->so_state & ss_cantsendmore為真),若是則返回epipe並向所屬程序傳送sigpipe訊號(該訊號的預設行為是中止程序,muduo對該訊號做了忽略處理)。接著檢查套接字是否已連線,若不是則返回enotconn。對於無連線協議若未指定目的位址則返回edestaddrreq。

recvmsg函式的第二個引數比較複雜,在次對其進行講解,並對控制資訊引數的使用進行舉例說明:

void oobserver::handersigurg() // 真正處理sigurg訊號

TCP IP實現(八) 插口層

插口層可以說是在使用者程式與tcp ip協議之間的乙個呈上啟下的層次,它將使用者與某協議相關的請求對映到具體的協議實現。不同型別的套接字在產生時就會關聯到相關協議實現 通過一組函式指標來實現的 比如在乙個tcp套接字上呼叫write函式,則會轉而呼叫tcp協議相關的函式。插口也就是我們常說的套接字,...

速讀原著 TCP IP 插口排錯選項

檢視乙個t c p連線上發生的事情的另一種方法是使能插口排錯選項,當然是在支援這一特徵的系統中。這個特徵只能工作在 t c p上 其他協議都不行 並且需要應用程式支援 當應用程式啟動時,使能乙個插口排錯選項 大多數伯克利演變的實現都支援這個特徵,包括s u nos 4.4bsd和svr4。程式使能了...

TCP IP網路程式設計 IO復用

引入復用技術,可以減少程序數,無論連線多少客戶端,提供服務的程序只有乙個。select函式可以實現io復用,它可以將多個檔案描述符集中到一起統一監視 是否存在套接字接收資料?無需阻塞傳輸資料的套接字有哪些?哪些套接字發生了異常?下面是具體用例 復用 時分復用 頻分復用 使用select函式完成io復...