一、通訊基礎
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...