這個位址結構因協議不同而有不同定義,
因此以指標形式傳遞同時傳遞長度。主要包括成員
family, addr, port
位址結構中的ip
位址值和埠值都是網路位元組序
(大端模式)。
主機位元組序和網路位元組序間的轉換函式:htons(...), htonl(...), ntohs(...), ntohl(...)
字串形式和網路位元組序間的轉換函式:inet_aton(...), inet_addr(...), inet_ntoa(...), inet_pton(...), inet_ntop(...)
socket(...) 建立套介面識別符號
(關聯網路層協議族
ipv4/ipv6
和傳輸層型別
tcp/udp)
。狀態為
closed
bind(...) 繫結二元組(關聯
ip和port)
。伺服器端要繫結眾所周知的ip和
port
,客戶端則由核心分配
ip和臨時
port。
listen(...) 說明為被動套介面和指定最大連線數。狀態由
closed
轉為listen
。核心為臨聽套介面維護這個佇列:
(1)未完成連線佇列
,狀態為
syn_recv
,定時rtt
掉棄;(2)
已完成連線佇列
,狀態為
established
。最大連線數為兩佇列數和。
accept(...) 從已完成連線佇列中返回隊頭項。
connect(...) (阻塞
)完成連線的三次握手或出錯時返回。出錯情況:
(1)etimeout
;(2)econnrefused,
接收到rst
響應;(3)ehostunreach
網路不可達。 狀態由
closed先
轉為syn_send
,如成功則最終轉為
established,
如出錯則必須呼叫
close(..)
轉為closed
close(...) 識別符號記數減
1,如記數為
0則關閉識別符號。另shutdown(...)可實現半關閉。
伺服器關閉連線。
伺服器端反應:傳送fin給客戶端(轉為close_wait狀態),傳送sigchld給父程序,等待客戶端發來的fin並再傳送ack響應。如
客戶端反應:收到fin並回ack,傳送fin給伺服器
(轉為time_wait狀態)
並等待ack。如此時試圖傳送資料到伺服器,會得到rst回應。再次試圖傳送資料時程序收到sigpipe訊號。
伺服器主機崩潰。
伺服器端反應:不傳送任何東西。
客戶端反應:在試圖傳送資料到伺服器前並不知伺服器已關閉。主動試圖傳送資料時才得到出錯情況。
伺服器主機崩潰重啟。
伺服器端反應:應用程式無反應。
客戶端反應:試圖用之前的套介面傳送資料到伺服器,會得到rst回應。
fork(...) 新建立乙個子程序(父程序的拷貝)。父程序返回子程序
id,子程序返回
0,已開啟描述符共享。
訊號是發生某事件時對程序的通知。一般是非同步的。
處理:(1)預設處理; (2)sigaction/signal設定自已的處理函式,原型void handler(int signo);
乙個程序結束時會向其父程序傳送sigchld訊號,並且如其父程序
沒有等待(wait / waitpid)他,那麼他將變成乙個殭屍程序駐留在記憶體中。
輸入操作一般有兩個不同的階段:(1)等待資料準備好;(2)從核心到程序拷貝資料。(1)阻塞。常用,阻塞直到資料已準備好並從核心拷貝到程序空間;
(2)非阻塞。不常用,呼叫i/o函式直接返回,如資料未準備好則報錯ewouldblock,如資料已準備好則把資料從核心拷貝到程序空間;
(3)i/o復用(select/poll)。處理多個描述符時常用,select呼叫阻塞直到有感興趣描述符事件發生則返回,此時呼叫i/o操作把資料從核心拷貝到程序空間;
(4)訊號驅動i/o(sigio)。先設定好訊號sigio的自定義處理函式。待資料準備好時程序會收到sigio訊號,此時呼叫i/o操作把資料從核心拷貝到程序空間;
(5)非同步i/o(aio_*)。
呼叫非同步i/o
函式不阻塞。資料準備好並從核心 拷到程序空間後才通知程序(訊號或指定函式方式通知)。
乙個或多個i/o條件(讀/寫/異常)滿足時,核心通知程序。select(...) 測試感興趣的描述符事件是否發生。
描述符數設上限
poll(...) 與select類似,但不限描述符數量,則只少於open_max。
UNIX網路程式設計 基本TCP套接字程式設計
一 基於tcp協議的網路程式 下圖是基於tcp協議的客戶端 伺服器程式的一般流程 伺服器呼叫socket bind listen 完成初始化後,呼叫accept 阻塞等待,處於監聽埠的狀態,客戶端呼叫socket 初始化後,呼叫connect 發出syn段並阻塞等待伺服器應答,伺服器應答乙個syn ...
UNIX網路程式設計
在unix network programming 的 3.7 inet pton and inet ntop functions 中提到中有如下兩個巨集定義 define inet addrstrlen 16 for ipv4 dotted decimal define inet6 addrstr...
unix網路程式設計
任何tcp的實現都需要為msl選擇乙個合適的值,rfc的建議值是2分鐘。分組可能出現迷途,若迷途分組在msl中找到路,造成重複,tcp必須修復 time wait存在的理由 可靠的實現全雙工的連線和終止 考慮最終ack丟失的情況,允許老的重複分組在網路中消逝 tcp的化生身現象,因為time wai...