socket(int domain, int type, int protocol)函數參數詳解

  • 函數原型

#include<sys/types.h>
#include<sys/socket.h>
int socket(int domain, int type, int protocol);

  • 參數詳解
  1. domain

用於設置網絡通信的域,函數根據這個參數選擇通信協議的族。通信協議族在文件sys/socket.h中定義。

名稱 含義 名稱 含義
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 底層包訪問
  1. type

type用於設置套接字通信的類型,主要有SOCKET_STREAM(流式套接字)、SOCK——DGRAM(數據包套接字)等。

名稱 含義
SOCK_STREAM Tcp連接,序列化、可靠、雙向連接的字節流。支持帶外數據傳輸
SOCK_DGRAM 支持UDP連接(無連接狀態的消息)
SOCK_SEQPACKET 序列化包,提供一個序列化、可靠、雙向的基本連接的數據傳輸通道,數據長度定常。每次調用讀系統調用時數據需要將全部數據讀出
SOCK_RAW RAW類型,提供原始網絡協議訪問
SOCK_RDM 提供可靠的數據報文,不過可能數據會有亂序
SOCK_PACKET 這是一個專用類型,不能呢過在通用程序中使用

並不是所有的協議族都實現了這些協議類型,例如,AF_INET協議族就沒有實現SOCK_SEQPACKET協議類型。

  1. protocol

用於制定某個協議的特定類型,即type類型中的某個類型。通常某協議中只有一種特定類型,這樣protocol參數僅能設置爲0;但是有些協議有多種特定的類型,就需要設置這個參數來選擇特定的類型。

  • 類型爲SOCK_STREAM的套接字表示一個雙向的字節流,與管道類似。流式的套接字在進行數據收發之前必須已經連接,連接使用**connect()**函數進行。一旦連接,可以使用read()或者write()函數進行數據的傳輸。流式通信方式保證數據不會丟失或者重複接收,當數據在一段時間內任然沒有接受完畢,可以認爲這個連接已經死掉。
  • SOCK_DGRAMSOCK_RAW 這個兩種套接字可以使用函數**sendto()**來發送數據,使用recvfrom()函數接受數據,recvfrom()接受來自制定IP地址的發送方的數據。
  • SOCK_PACKET是一種專用的數據包,它直接從設備驅動接受數據。
  1. errno
含義
EACCES 沒有權限建立制定的domain的type的socket
EAFNOSUPPORT 不支持所給的地址類型
EINVAL 不支持此協議或者協議不可用
EMFILE 進程文件表溢出
ENFILE 已經達到系統允許打開的文件數量,打開文件過多
ENOBUFS/ENOMEM 內存不足。socket只有到資源足夠或者有進程釋放內存
EPROTONOSUPPORT 制定的協議type在domain中不存在
  1. 建立一個流式套接字
int sock = socket(AF_INET, SOCK_STREAM, 0);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章