網路基礎 網路程式設計套接字

2021-08-19 23:31:55 字數 2133 閱讀 1289

埠號(port)是傳輸層協議的內容,標示了這台機器上唯一的程序。

為什麼要有套接字,舉個例子:

郵寄一封信,我們不僅需要知道郵編號碼,還需要知道收件人的門牌號,而此處的郵編號相當於ip位址,而埠號就相當於門牌號。

我們已經知道,記憶體中的多位元組資料相對於記憶體位址有⼤端和小端之分, 磁碟⽂件中的多位元組資料相對於⽂件中的偏移位址也有⼤端小端之分, 網路資料流同樣有⼤端小端之分. 那麼如何定義網路資料流的位址呢?

為使網路程式具有可移植性,使同樣的c**在⼤端和⼩端計算機上編譯後都能正常運⾏,可以調⽤以下庫函式做網路位元組序和主機位元組序的轉換。

#includeuint32_t htonl(uint32_t hostlong);

uint16_t htons(uint16_t hostshort);

uint32_t ntohl(uint32_t netlong);

uint16_t ntohs(uint16_t netshort);

// 建立 socket ⽂件描述符 (tcp/udp, 客戶端 + 伺服器)

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

type:  tcp:sock_stream   udp:sock_dgram

protocol:指定協議,若等於0,則用預設的方式連線

// 繫結端⼝號 (tcp/udp, 伺服器)

int bind(int socket, const struct sockaddr *address,socklen_t address_len);

address:指向sockaddr結構體型別的指標     address_len:結構體長度,用sizeof獲得

// 開始監聽socket (tcp, 伺服器)

int listen(int socket, int backlog);

backlog:等待連線佇列的最大長度,一般設定為5-10,不可設定太長

// 接收請求 (tcp, 伺服器)

int accept(int socket, struct sockaddr* address,socklen_t* address_len);

// 建⽴連線 (tcp, 客戶端)

sockaddr_in結構體內主要有三部分資訊:位址型別、埠號、ip位址。 

字串轉in_addr函式

#include int inet_aton(const char* strptr, struct in_addr* addrptr);

in_addr_t inet_addr(const char* strptr);

int inet_pton(int family, const char* strptr, void* addrptr);

in_addr轉字串函式

char* inet_ntoa(struct in_addr inaddr);

const char* inet_ntop(int family, const void* addrptr, char* strptr, size_t len);

其中inet_pton和inet_ntop不僅可以轉換ipv4的in_addr,還可以轉換ipv6的in6_addr,因此函式介面是void*addrptr。

那麼問題來了, 如果我們呼叫多次這個函式, 會有什麼樣的效果呢? 參見如下**

網路套接字程式設計基礎

struct sockaddr和struct sockaddr in這兩個結構體用來處理網路通訊的位址。struct sockaddr sockaddr in在標頭檔案 include或 include中定義,該結構體解決了sockaddr的缺陷,把port和addr 分開儲存在兩個變數中,如下 s...

Linux 網路基礎及網路程式設計套接字

網路基礎1 網路發展背景 網路程式設計的前情提要 網路通訊協議 通訊雙方對通絡通訊資料訊號的解析式 協議分層 優點 將提供的服務,以及協議介面進行封裝後,使用起來比較方便,替換起來更加清晰簡單 按照網路通訊中的協議,介面,服務對網路通訊進行分層 tcp ip五層模型 來自於osi七層模型 tcp i...

UNIX網路程式設計 基礎套接字程式設計

就像 unix網路程式設計 裡面說的,我們可以將tcp的連線看成乙個 系統,那麼我們的套接字位址結構,就是我們的 裡面號碼,和其他能確定我們身份資訊的集合。其中ipv4的,我們已經很熟悉,還有另外的,在ipv6如果系統支援長度字段,那麼sin6 len常值必須定義,在使用這一結構時我們必須分清到底,...