unix網路編程之基本套介面編程

來源:互聯網
上載者:User

標籤:unix

第一章  套介面編程簡介

IPv4套介面地址:“網際套介面地址結構”

通用套介面地址結構:

套介面函數被定義為採用指向通用套介面地址結構的指標,這要求對這些函數的任何調用都必須將指向特定於協議的套介面地址結構的指標類型轉換成指向通用套介面地址結構的指標:

套介面地址結構的比較:

值-結果參數:

當把套介面地址結構傳遞給套介面函數時,總是通過指標來傳遞的,即傳遞的是一個指向結構的指標。

1, 從進程到核心傳遞套介面地址結構有3個函數:bind、connect、sendto,這3個函數的一個參數時指向套介面地址結構的指標,另一個參數是結構的整數大小,例如:

2,與前面的傳遞方向相反,從核心到進程的傳遞套介面地址結構有4個函數:accept、recvfrom、getsockname和getpeername。這4個函數的兩個參數是:指向套介面地址借口的指標和指向表示結構大小的整數的指標,例如:

這樣len不僅作為值傳遞也作為結構返回,引用參數你懂的。被稱為值-結果參數。

位元組排序函數:

小端位元組序:將低序位元組儲存在起始地址;

大端位元組序:將高序位元組儲存在起始地址;

主機位元組序和網路位元組序間要相互轉換:

位元組操縱函數:

bzero將目標中指定數目的位元組置為0,

 

 

 

第二章  基本套介面編程

TCP客戶與伺服器間發生的一些典型事件的時間表:

Socket函數:

int socket(int domain , int type , int protocol)

socket函數在成功時返回一個小的非負整數值,它與檔案描述字類似,我們把它稱為套介面描述字,簡稱通訊端。

Connect函數:

int connect (int sockfd, struct sockaddr*serv_addr, int addrlen);

TCP客戶用connect函數來建立一個與TCP伺服器的串連。

如果是tcp套介面的話,函數connect激發TCP的三路握手過程。

bind函數:

int bind (int sockfd , struct sockaddr *my_addr ,int addrlen) ;

函數bind給套介面分配一個本地協議地址。其中套介面是捆綁的主體,地址和連接埠則是捆綁在套介面上的客體。

對於IPV4來說,通配地址由常值INADDR_ANY來指定,其值一般為0,它通知核心選擇IP地址。

listen函數

int listen(int sockfd, int backlog);

第二個參數規定了核心為此套介面排隊的最大串連個數。

對於給定的監聽套介面,核心要維護兩個隊列:

accept函數:

int accept(int sockfd, void *addr, int *addrlen);

accept由TCP伺服器調用,從已完成串連隊列頭返回下一個已完成串連。若已完成串連隊列為空白,則進程睡眠。

參數addr和addrlen用來返回對方進程(客戶)的協議地址,addrlen是值-結構參數:調用前,我們將由*addrlen所指的整數值置為由addr所指的套介面地址結構的長度,返回時,此整數值即為有核心存在此套介面地址結構內的準確位元組數。

如果函數執行成功,則返回值是由核心自動產生的一個全新描述字,代表與客戶的TCP串連。

並發伺服器:具體的例子請參見本部落格中的unix網路編程執行個體9種TCP客戶-伺服器程式設計附環境搭建和編譯方法

不可能讓一個伺服器嘗試間地位某一個客戶服務,而是同時為多個客戶服務。

當父進程close關閉connfd子進程關閉listerfd後:

如果父進程不對每個由accept返回的已串連套介面調用close,並發伺服器會發生什麼。

首先,父進程最終將耗盡可用描述字,因為任何進程…

第三章  TCP客戶-伺服器程式例子

回射伺服器:

1, 客戶從標準輸入讀一行文本,寫到伺服器上;

2, 伺服器從網路輸入讀此行,並回射給客戶;

3, 客戶度此回射行並寫到標準輸出;

Posix訊號:

訊號時發生某事件時對進程的通知,有時稱為非強制中斷。它一般是非同步,這就是說,進程不可能提前知道訊號發生的時間。

訊號可以:

由一進程發往另一進程(或本身);

由核心發往某進程;

SIGSTOP 停止(stopped)進程的執行. 注意它和terminate以及interrupt的區別:

該進程還未結束, 只是暫停執行. 本訊號不能被阻塞, 處理或忽略

對於SIGKILL訊號,進程是不能忽略的。這是一個 “我不管您在做什麼,立刻停止”的訊號。假如您發送SIGKILL訊號給進程,Linux就將進程停止在那裡。

這兩個進程都不能被捕捉;

處理SIGCHLD訊號:

設定殭屍狀態的目的就是維護子進程的資訊,以便父進程在稍後的某個時候取回。如果進程將SIGCHLD的處理方法置為SIG_IGN,它的子進程就不會成為殭屍進程。另一個處理殭屍進程的方法就是捕捉SIGCHLD,並調用wait或waitpid;

殭屍進程:

由於子進程的結束和父進程的運行是一個非同步過程,即父進程永遠無法預測子進程 到底什麼時候結束. 那麼會不會因為父進程太忙來不及wait子進程,或者說不知道 子進程什麼時候結束,而丟失子進程結束時的狀態資訊呢? 不會。因為UNIX提供了一種機制可以保證只要父進程想知道子進程結束時的狀態資訊, 就可以得到。這種機制就是: 在每個進程退出的時候,核心釋放該進程所有的資源,包括開啟的檔案,佔用的記憶體等。 但是仍然為其保留一定的資訊(包括進程號the process ID,退出狀態the termination status of the process,已耗用時間the amount of CPU time taken by the process等)。直到父進程通過wait / waitpid來取時才釋放. 但這樣就導致了問題,如果進程不調用wait / waitpid的話, 那麼保留的那段資訊就不會釋放,其進程號就會一直被佔用,但是系統所能使用的進程號是有限的,如果大量的產生僵死進程,將因為沒有可用的進程號而導致系統不能產生新的進程. 此即為殭屍進程的危害,應當避免。

在這段代碼中,我們所做的事情就是自己重啟被中斷的系統調用:

著作權聲明:本文為博主http://www.zuiniusn.com原創文章,未經博主允許不得轉載。

unix網路編程之基本套介面編程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.