《unix網路程式設計》基本套介面程式設計

2021-06-13 21:02:17 字數 2725 閱讀 2969

這個位址結構因協議不同而有不同定義,

因此以指標形式傳遞同時傳遞長度。主要包括成員

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...