Linux 使用 socket 函數來創建一個套接字描述符。
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
如果函數調用成功,則返回套接字的描述符,是一個正整數,如果函數調用失敗則返回 -1。
對函數中的各個參數描述如下:
- domain:套接字的協議族,其支持的類型說明如表所示,socket 函數可以支持多種網絡協議,在使用時必須指定當前使用的協議。
socket 函數支持的協議族
協議族名稱 | 描述 |
---|---|
AF_UNIX,AF_LOCAL | 本地交互協議 |
AF_INET | IPv4 協議 |
AF_INET6 | IPv6 協議 |
AF_IPX | IPX-Novell 協議 |
AF_NETLINK | 內核接口設備協議 |
AF_X25 | ITU-T X.25/ISO-8208 協議 |
AF_AX25 | 業餘無線電 AX.25 協議 |
AF_ATMPVC | 原始 ATM 接入協議 |
AF_APPLETALK | 蘋果的 Appletalk 協議 |
AF_PACKET | 底層數據包接口 |
- type:用於指定當前的套接字類型,socket 函數支持的套接字類型包括 SOCK_STREAM(數據流)、SOCK_DGRAM(數據報)、SOCK_SEQPACKET(順序數據報)、SOCK_RAW(原始套接字)、SOCK_RDM(可靠傳遞消息)、SOCK_PACKET(數據包)。
- protocol:除了在使用原始套接字以外,(通常情況下設置爲0,以表示使用默認的協議。在 Linux 系統中創建一個套接字時會在內核中創建一個套接字數據結構,然後返回一個套接字描述符標識這個套接字數據結構。這個套接字數據結構包含連接的各種信息,如對方地址、 TCP 狀態以及發送接收緩衝區等。TCP 協議根據這個套接字數據結構的內容來控制這條連接。
【例1】使用 socket 函數創建套接字
應用代碼調用 socket 函數來建立一個套接字,設定套接字使用的協議是 AF_INET,套接字類型爲 STREAM,如果創建成功,則返回對應的套接字描述符。
實例的應用代碼如下:
#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
int main(int argc,char *argv[])
{
int sockfd; //定義套接口描述符
if(sockfd = socket(AF_INET,SOCK_STREAM,0) < 0) //建立一個 socket
{
printf("創建套接字失敗。\n");
return 1;
}
else //socket 創建成功
{
printf("套接字的ID是:%d\n", sockfd);
}
return 0;
}