socket()函數的原型以下,這個函數創建一個協議族爲domain、協議類型爲type、協議編號爲protocol的套接字文件描述符。若是函數調用成功,會返回一個標識這個套接字的文件描述符,失敗的時候返回-1。網絡
#include<sys/types.h>
dom
#include<sys/socket.h>
socket
int socket(int domain, int type, int protocol);
函數
函數socket()的參數domain用於設置網絡通訊的域,函數socket()根據這個參數選擇通訊協議的族。通訊協議族在文件sys/socket.h中定義。spa
表1 domain的值及含義code
名稱 | 含義 | 名稱 | 含義 |
---|---|---|---|
PF_UNIX,PF_LOCAL | 本地通訊 | PF_X25 | ITU-T X25 / ISO-8208協議 |
AF_INET,PF_INET | IPv4 Internet協議 | PF_AX25 | Amateur radio AX.25 |
PF_INET6 | IPv6 Internet協議 | PF_ATMPVC | 原始ATM PVC訪問 |
PF_IPX | IPX-Novell協議 | PF_APPLETALK | Appletalk |
PF_NETLINK | 內核用戶界面設備 | PF_PACKET | 底層包訪問 |
函數socket()的參數type用於設置套接字通訊的類型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(數據包套接字)等。進程
表2 type的值及含義內存
名稱 | 含義 |
---|---|
SOCK_STREAM | Tcp鏈接,提供序列化的、可靠的、雙向鏈接的字節流。支持帶外數據傳輸 |
SOCK_DGRAM | 支持UDP鏈接(無鏈接狀態的消息) |
SOCK_SEQPACKET | 序列化包,提供一個序列化的、可靠的、雙向的基本鏈接的數據傳輸通道,數據長度定常。每次調用讀系統調用時數據須要將所有數據讀出 |
SOCK_RAW | RAW類型,提供原始網絡協議訪問 |
SOCK_RDM | 提供可靠的數據報文,不過可能數據會有亂序 |
SOCK_PACKET | 這是一個專用類型,不能呢過在通用程序中使用 |
並非全部的協議族都實現了這些協議類型,例如,AF_INET協議族就沒有實現SOCK_SEQPACKET協議類型。資源
函數socket()的第3個參數protocol用於制定某個協議的特定類型,即type類型中的某個類型。一般某協議中只有一種特定類型,這樣protocol參數僅能設置爲0;可是有些協議有多種特定的類型,就須要設置這個參數來選擇特定的類型。原型
函數socket()並不老是執行成功,有可能會出現錯誤,錯誤的產生有多種緣由,能夠經過errno得到:
表3 errno的值及含義
值 | 含義 |
---|---|
EACCES | 沒有權限創建制定的domain的type的socket |
EAFNOSUPPORT | 不支持所給的地址類型 |
EINVAL | 不支持此協議或者協議不可用 |
EMFILE | 進程文件表溢出 |
ENFILE | 已經達到系統容許打開的文件數量,打開文件過多 |
ENOBUFS/ENOMEM | 內存不足。socket只有到資源足夠或者有進程釋放內存 |
EPROTONOSUPPORT | 制定的協議type在domain中不存在 |
其餘 |
創建一個流式套接字:
int sock = socket(AF_INET, SOCK_STREAM, 0);