LWIP學習筆記7——使用 Socket 接口編程

1 使用 Socket 接口編程

在 LwIP 中, Socket API 是基於 NETCONN API 之上來實現的,系統最多提供MEMP_NUM_NETCONN 個 netconn 連接結構,因此 Socket 套接字的個數也是那麼多個,爲了更好對 netconn 進行封裝, LwIP 還定義了一個套接字結構體——lwip_sock(我稱之爲Socket 連接結構) , 每個 lwip_sock 內部都有一個 netconn 的指針, 實現了對 netconn 的再次封裝。
LwIP 定義了一個 lwip_sock 類型的 sockets數組, 通過套接字就可以直接索引並且訪問這個結構體了, 這也是爲什麼套接字是一個整數的原因。

1.1 Socket API

socket()
bind()
用於服務器端綁定套接字與網卡信息
connect()
它用於客戶端中,將 Socket 與遠端 IP 地址、端口號進行綁定,在
TCP 客戶端連接中,調用這個函數將發生握手過程(會發送一個 TCP 連接請求),並最終建立新的 TCP 連接,而對於 UDP 協議來說,調用這個函數只是在 UDP 控制塊中記錄遠端IP 地址與端口號,而不發送任何數據。
listen()
只能在 TCP 服務器中使用,讓服務器進入監聽狀態,等待遠端的連接請求, LwIP 中可以接收多個客戶端的連接。
accept()
用於 TCP 服務端中,等待着遠端主機的連接請求,並且建立一個新的 TCP 連接,在調用這個函數之前需要通過調用 listen()函數讓服務器進入監聽狀態。 accept()函數的調用會阻塞應用線程直至與遠程主機建立 TCP 連接。
read()、 recv()、 recvfrom()
sendto()
send()
end()函數可以用於 UDP 協議和 TCP 連接發送數據。在調用 send()函數之前,必須使用 connect()函數將遠端主機的 IP 地址、端口號與 Socket 連接結構進行綁定。對於 UDP 會話, send()函數將調用 lwip_sendto()函數發送數據, 而對於 TCP 連接, 將調用netconn_write_partly()函數發送數據。
write()
這個函數一般用於處於穩定的 TCP 連接中傳輸數據,當然也能用於 UDP 協議中,它也是基於 lwip_send 上實現的,但是無需我們設置 flag 參數。
close()
close()函數是用於關閉一個指定的套接字,在關閉套接字後,將無法使用對應的套接字描述符索引到連接結構,如果連接是 TCP 協議,將產生一個請求終止連接的報文發送到對端主機中,如果是 UDP 協議,將直接釋放 UDP 控制塊的內容。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章