網路程式設計基礎《二》

2021-07-16 09:32:22 字數 1684 閱讀 1654

一、通訊基礎

1.tcp通訊流程

伺服器呼叫socket()、bind()、listen()完成初始化後,呼叫accept()阻塞等待,處於監聽埠的狀態,客戶端呼叫socket()初始化後,呼叫connect()發出syn段並阻塞等待伺服器響應,伺服器應答乙個syn+ack段,客戶端接收到後從connect()返回,同時應答乙個ack段,伺服器收到後從accept()返回

建立連線後,tcp協議提供全雙工的通訊服務,伺服器從accept()返回後,立刻呼叫read(),讀socket,若沒有資料到達就阻塞等待;客戶端調write()傳送,請求給伺服器,伺服器收到後從read()返回,對客戶端的請求進行處理,在此期間客戶端呼叫read()阻塞等待伺服器應答,伺服器呼叫write()將處理結果發回客戶端,再次呼叫read()阻塞等待下一條請求,客戶端收到後從read()返回,傳送下一條請求,如此迴圈。

當客戶端沒有更多的請求,就呼叫close()關閉連線,就像寫端關閉管道一樣,伺服器的read()返回0,這樣的伺服器就知道客戶端關閉了連線,也呼叫close()關閉連線。

任何一方呼叫close()後,連線的兩個傳輸方向都關閉,不再傳送資料。若一方呼叫shutdown()則連線處於半關閉狀態,仍可接受對方發來的資料。

二、 程序通訊到網路通訊

1、 socketpair

pipe用於建立管道,用於有血緣關係的兩個程序之間,且是單方向的資料傳輸。若要實現程序的雙向通訊,必須建立一對管道。而socketpair則可以用來建立雙向通訊的管道。

函式socketpair()

套接字可以用於網路通訊,也可以用於本機內的程序通訊。由於本機內程序的ip位址都相同,因此只需要程序號來確定通訊的雙方。linux下使用socketpair函式建立一對未命名的、互相連線的unix域套接字。

其中,引數一表示套介面的域,引數二表示套介面型別,引數三表示使用的協議,引數四表示指向儲存檔案描述符的指標。

建立成功返回0,建立失敗返回-1.

實現程序間通訊:

2.dup/dup2

dup和dup2都可以用來複製乙個現存的檔案描述符,使兩個檔案描述符指向同乙個file結構體。

例:dup

例 dup2

三、伺服器模型

使用select()、poll()、epoll()介面的基於事件驅動的伺服器模型。

從多個客戶端接收資料的模型

Linux網路程式設計基礎 二

1 位元組轉換函式 在網路上面有著許多態別的機器,這些機器在表示資料的位元組順序是不同的,比如i386晶元是低位元組在記憶體位址的低端,高位元組在高階,而alpha晶元卻相反.為了統一起來,在linux下面,有專門的位元組轉換函式.unsigned long int htonl unsigned l...

Linux網路程式設計基礎二

服務套和客戶機的資訊函式 1 位元組轉換函式 在網路上面有著許多態別的機器,這些機器在表示資料的位元組順序是不同的,比如i386晶元是低位元組在記憶體位址的低端,高位元組在高階,而alpha晶元卻相反.為了統一起來,在linux 下面,有專門的位元組轉換函式.unsigned long int ht...

Android網路程式設計基礎 二

android學習筆記,整理給自己複習的時候看的,謝謝!android端的預設編碼是utf 8 一般在公司開發客戶端和服務端的編碼要保持一致。做url請求時需要對引數進行urlencode編碼.url url new url http 169.254.248.190 8080 jokerjohn s...