Unix網路程式設計讀書筆記(五)

2021-07-22 06:28:34 字數 1542 閱讀 3310

使用udp編寫的一些常見的應用程式有:dns(網域名稱系統)、nfs(網路檔案系統)和snmp(簡單網路關係協議)。

udp協議的通訊函式分別是sendto與recvfrom函式,函式原型如下:

#include extern ssize_t recvfrom (int __fd, void *__restrict __buf, size_t __n,

int __flags, __sockaddr_arg __addr,

socklen_t *__restrict __addr_len);

extern ssize_t sendto (int __fd, const void *__buf, size_t __n,

int __flags, __const_sockaddr_arg __addr,

socklen_t __addr_len);

寫乙個長度為0的資料報是可行的,這一資料報的長度就是ip首部(ipv4下是20,ipv6下是40)加上udp首部(8位元組)。

從tcp套接字上read返回0值表示對端已關閉連線,但udp套接字上recvfrom返回0值是可以接受。

udp輸出操作成功返回僅僅表示在介面輸出佇列中具有存放所形成ip資料報的空間。

伺服器可從到達的ip資料報中獲取的資訊。

來自客戶的ip資料報

tcp伺服器

udp伺服器

源ip位址

accept

recvfrom

源埠accept

recvfrom

目的ip位址

getsockname

recvmsg

目的埠

getsockname

getsockname

與未連線的udp套接字相比,已連線的套接字(呼叫了connect函式的套接字)有以下三點變化:

無法再為輸出操作指定目的ip位址和埠號。

不必使用recvfrom以獲悉資料報的傳送者,而改用read、recv或recvmsg函式。

由已連線udp套接字引發的非同步錯誤會返回給它們所在的程序,而未連線套接字不接收任何非同步錯誤。

對上述內容總結如下表:

套接字型別

write或send

不指定目的位址的sento

指定目的位址的sento

tcp套接字

可以可以

eisconn

udp套接字,已連線

可以可以

eisconn

udp套接字,未連線

edestaddreq

edestaddreq可以

對乙個已連線的udp套接字多次呼叫connect可以實現以下目標:

指定新的ip位址和埠號。

斷開套接字。

tcp套接字只能呼叫一次connect函式。

已連線udp套接字還可用於確定用於某個特定目的地的外出介面。這是由connect函式應用到udp套接字時的乙個***造成的:核心選擇本地ip位址。這個本地ip位址通過為目的ip位址搜尋路由表得到外出介面,然後選擇該介面的主ip位址而選定。

Unix網路程式設計讀書筆記(二)

套接字位址結構 typedef uint32 t in addr t struct in addr struct sockaddr in 在使用結構前總是把整個結構置零,是由於sin zero欄位沒有任何作用,只需置零即可。為了是套接字函式在處理位址時具有一定的通用性,套接字函式還定義了通用套接字位...

Unix網路程式設計讀書筆記(四)

unix下共有5種i o模型 阻塞式i o 非阻塞式i o i o復用 select和poll 訊號驅動式i o sigio 非同步i o posix的aio 系列函式 同步i o與非同步i o 同步i o操作導致請求程序阻塞,直到i o操作完成。前4種模型都是同步i o模型,因為其中真正的i o操...

讀書筆記 unix網路程式設計 20170703

終於看完了unix網路程式設計卷一,其實不能說看完了,只能說溜了一遍,中間有好多不明白的,還需要繼續理解。這裡寫一下發現的疑問,可能有些不是書上的,是其他地方發現的,也一起寫到這裡了 筆記內容 1 i o復用典型使用在下列網路應用場合 122頁 a 當客戶處理多個描述符 b 乙個客戶同時處理多個套接...