socket 函式用法詳解 建立套接字

2021-10-08 11:30:14 字數 2163 閱讀 9313

不管是 windows 還是 linux,都使用 socket() 函式來建立套接字。socket() 在兩個平台下的引數是相同的,不同的是返回值。

在《socket是什麼》一節中我們講到了 windows 和 linux 在對待 socket 方面的區別。

linux 中的一切都是檔案,每個檔案都有乙個整數型別的檔案描述符;socket 也是乙個檔案,也有檔案描述符。使用 socket() 函式建立套接字以後,返回值就是乙個 int 型別的檔案描述符。

windows 會區分 socket 和普通檔案,它把 socket 當做乙個網路連線來對待,呼叫 socket() 以後,返回值是 socket 型別,用來表示乙個套接字。

在 linux 下使用 標頭檔案中 socket() 函式來建立套接字,原型為:

int socket(int af, int type, int protocol);
1) af 為位址族(address family),也就是 ip 位址型別,常用的有 af_inet 和 af_inet6。af 是「address family」的簡寫,inet是「inetnet」的簡寫。af_inet 表示 ipv4 位址,例如 127.0.0.1;af_inet6 表示 ipv6 位址,例如 1030::c9b4:ff12:48aa:1a2b。

大家需要記住127.0.0.1,它是乙個特殊ip位址,表示本機位址,後面的教程會經常用到。

你也可以使用 pf 字首,pf 是「protocol family」的簡寫,它和 af 是一樣的。例如,pf_inet 等價於 af_inet,pf_inet6 等價於 af_inet6。
2) type 為資料傳輸方式/套接字型別,常用的有 sock_stream(流格式套接字/面向連線的套接字) 和 sock_dgram(資料報套接字/無連線的套接字),我們已經在《套接字有哪些型別》一節中進行了介紹。

3) protocol 表示傳輸協議,常用的有 ipproto_tcp 和 ipptoto_udp,分別表示 tcp 傳輸協議和 udp 傳輸協議。

有了位址型別和資料傳輸方式,還不足以決定採用哪種協議嗎?為什麼還需要第三個引數呢?

正如大家所想,一般情況下有了 af 和 type 兩個引數就可以建立套接字了,作業系統會自動推演出協議型別,除非遇到這樣的情況:有兩種不同的協議支援同一種位址型別和資料傳輸型別。如果我們不指明使用哪種協議,作業系統是沒辦法自動推演的。

本教程使用 ipv4 位址,引數 af 的值為 pf_inet。如果使用 sock_stream 傳輸資料,那麼滿足這兩個條件的協議只有 tcp,因此可以這樣來呼叫 socket() 函式:

int tcp_socket = socket(af_inet, sock_stream, ipproto_tcp);  //ipproto_tcp表示tcp協議
這種套接字稱為 tcp 套接字。

如果使用 sock_dgram 傳輸方式,那麼滿足這兩個條件的協議只有 udp,因此可以這樣來呼叫 socket() 函式:

int udp_socket = socket(af_inet, sock_dgram, ipproto_udp);  //ipproto_udp表示udp協議
這種套接字稱為 udp 套接字。

上面兩種情況都只有一種協議滿足條件,可以將 protocol 的值設為 0,系統會自動推演出應該使用什麼協議,如下所示:

int tcp_socket = socket(af_inet, sock_stream, 0);  //建立tcp套接字

int udp_socket = socket(af_inet, sock_dgram, 0); //建立udp套接字

後面的教程中多採用這種簡化寫法。

windows 下也使用 socket() 函式來建立套接字,原型為:

socket socket(int af, int type, int protocol);
除了返回值型別不同,其他都是相同的。windows 不把套接字作為普通檔案對待,而是返回 socket 型別的控制代碼。請看下面的例子:

socket sock = socket(af_inet, sock_stream, 0);  //建立tcp套接字

socket 函式用法詳解 建立套接字

不管是 windows 還是 linux,都使用 socket 函式來建立套接字。socket 在兩個平台下的引數是相同的,不同的是返回值。在 socket是什麼 一節中我們講到了 windows 和 linux 在對待 socket 方面的區別。linux 中的一切都是檔案,每個檔案都有乙個整數型...

socket 函式用法詳解 建立套接字

不管是 windows 還是 linux,都使用 socket 函式來建立套接字。socket 在兩個平台下的引數是相同的,不同的是返回值。在 socket是什麼 一節中我們講到了 windows 和 linux 在對待 socket 方面的區別。linux 中的一切都是檔案,每個檔案都有乙個整數型...

Socket用法詳解 1

socket的構造方法有以下幾種過載形式 1 socket 2 socket inetaddress address,int port throws unknownhostexception,ioexception 3 socket inetaddress address,int port,inet...