@網路程式設計學習記錄
socket被視為檔案的一種,網路程式設計中的資料傳輸同樣使用檔案i/o的相關函式。
int open(const char* path, int flag);
成功返回檔案描述符,失敗返回-1;
path為檔名的字串位址;
flag為檔案開啟模式,可選引數如下:
例子:
fd = open("data.txt", o_creat|o_wronly|o_trunc);
表明建立只能寫的空檔案,若已存在data.txt,則清空檔案的全部資料。
int close(int fd);
成功回0,失敗-1;
fd為檔案描述符。
ssize_t write(int fd, const void* buf, size_t nbytes);
ssize_t read(int fd, void* buf, size_t nbytes);
成功返回接受的位元組數,回0則表明遇到檔案結尾,失敗回-1;
fd :接受物件的檔案描述符;
buf: 要儲存的接受資料的緩衝位址值;
nbytes:要接受資料的最大位元組數。
建立socket的函式:
int socket(int domain, int type, int protocol);
成功返回檔案描述符,失敗返回-1;
domain指協議族(protocol family)資訊,最常見的:
pf_inet : ipv4;
pf_inet6 : ipv6;
type指套間字型別:
tcp: sock_stream;
udp: sock_dgram;
協議最終選擇:
對於大多數協議,當確認來前兩個引數即協議族和套間字型別後,其協議也就確定下來了,第三個引數可以直接傳遞0;
除非在同一協議族中存在有多個傳輸方式相同的協議。
舉例:建立ipv4中面向連線的套間字
int tcp_socket = socket(pf_inet, sock_stream, 0);
或int tcp_socket = socket(pf_inet, sock_stream, ipproto_tcp);
int bind(int sockfd, struct sockaddr* myaddr, socklen_t addrlen);
// 成功返回0,失敗-1;
先用sockaddr_in儲存ipv4相關的位址、埠等資訊,再將這些資訊賦值給sockaddr結構體作為bind等函式的引數。
sockaddr_in的結構體表示如下:
sockaddr的結構體表示為:
struct sockaddr
;
sockaddr_in只針對ipv4,而sockaddr並非只針對ipv4,所以sa_data後面幾位也都是0,在宣告sockaddr_in應使用memset將sockaddr_in的初始值設定成0。
以下給出乙個伺服器端常見套間字的初始化過程:
in_addr_t inet_addr(const char* string);
成功返回滿足網路位元組序的32位整型(即不需要再呼叫htonl()函式進行位元組序的轉換),失敗返回inaddr_none。
int listen(int sockfd, int backlog);
成功0,失敗-1;
backlog為請求等待佇列的長度,表示使最多backlog個連線請求進入佇列;
只有伺服器呼叫listen函式,客戶端才能呼叫connect函式,提前呼叫會出錯。
int accept(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
成功回檔案描述符,失敗回-1;
sockfd為伺服器套間字的檔案描述符;
addr為儲存發起連線請求的客戶端位址資訊的變數位址值;
addrlen為用來儲存第二個引數addr結構體長度的變數位址;
呼叫accept的過程可以自動生成用於資料傳輸的套接字。
int connect(int sockfd, struct sockaddr* addr, socklen_t* addrlen);
成功回0,失敗回-1;
sockfd表示客戶端套接字檔案描述符;
addr表示儲存目標伺服器端位址資訊的變數位址值;
addrlen為用來儲存第二個引數addr結構體長度的變數位址;
connect函式只有在伺服器端接受連線請求或傳送斷網等異常情況而中斷連線請求時才會完成函式呼叫。
注意:客戶端ip位址和埠號在呼叫connect函式時自動分配,無需呼叫標記的bind函式進行分配。
伺服器端:
客戶端:
相互間的關係:
學習筆記 網路程式設計基礎API
linux網路程式設計基礎api與核心內tc ip協議族關係。1.socket位址api ip位址及埠對,代表tcp通訊中的一方,稱為socket位址。socket就像pipe一樣,代表的是乙個檔案描述符。可以用socket 來建立。參考 include see notes include int ...
Linux網路程式設計學習筆記 TCP IP基礎 1
層級名稱 作用傳輸單位 應用層提 用程式間通訊 表示層處理資料格式,資料加密等 ppdu presentation 會話層建立,維護和管理會話 spdu session 傳輸層建立端到端鏈結 segment 段 網路層定址和路由選擇 packet 包 資料鏈路層 介質訪問,鏈路管理 frame 幀 ...
網路程式設計學習筆記,
說起來很慚愧,我本科專業是網路工程,但是對網路方面的知識學習還是不怎麼樣。隨著工作的不斷深入,發現自己的這方面的知識異常缺乏,最近也開始惡補了起來,這篇就是我這個星期看tcp ip協議詳解卷一的chapter1到10的簡要筆記。tcp ip協議棧有四個層次,分別是鏈路層,網路層,傳輸層,應用層。這四...