socket() - Unix,Linux系統呼叫 - 技術教學
Tutorials Point


  Unix入門
  Unix Shell程式設計
  高階Unix
  Unix有用參考
  Unix有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於TP  

socket() - Unix,Linux系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

socket - 建立通訊端點

概要

#include <sys/types.h>
#include <sys/socket.h>

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

描述

socket() 建立一個通訊端點並返回一個描述符。

domain 引數指定一個通訊域;這將選擇用於通訊的協議族。這些族在 <sys/socket.h> 中定義。當前已知的格式包括:

名稱用途手冊頁
本地通訊
IPv4網際網路協議
IPv6網際網路協議 
IPX - Novell協議 
核心使用者介面裝置
ITU-T X.25 / ISO-8208協議
業餘無線電AX.25協議 
訪問原始ATM PVC 
Appletalk
低階分組介面

套接字具有指示的type,它指定通訊語義。當前定義的型別為:

標籤描述
SOCK_STREAM
 提供有序的、可靠的、雙向的、基於連線的位元組流。可能支援帶外資料傳輸機制。
SOCK_DGRAM
 支援資料報(無連線的、不可靠的、長度固定的最大訊息)。
SOCK_SEQPACKET
 為長度固定的資料報提供有序的、可靠的、雙向的基於連線的資料傳輸路徑;使用者需要在每次讀取系統呼叫時讀取整個資料包。
SOCK_RAW
 提供原始網路協議訪問。
SOCK_RDM
 提供一個可靠的資料報層,但不保證排序。
SOCK_PACKET
 已過時,不應在新程式中使用;參見packet(7)。
並非所有協議族都實現某些套接字型別;例如,SOCK_SEQPACKET未在AF_INET中實現。

protocol 指定與套接字一起使用的特定協議。通常只有一個協議支援給定協議族內的特定套接字型別,在這種情況下,protocol 可以指定為 0。但是,可能存在許多協議,在這種情況下,必須以這種方式指定特定協議。要使用的協議號特定於發生通訊的“通訊域”;參見protocols(5)。關於如何將協議名稱字串對映到協議號,請參見getprotoent(3)。

型別為SOCK_STREAM的套接字是全雙工位元組流,類似於管道。它們不保留記錄邊界。在套接字上傳送或接收任何資料之前,流套接字必須處於已連線狀態。使用connect(2) 呼叫建立與另一個套接字的連線。連線後,可以使用read(2) 和write(2) 呼叫或send(2) 和recv(2) 呼叫的某些變體來傳輸資料。會話完成後,可以執行close(2)。帶外資料也可以按照send(2) 中的描述進行傳輸,並按照recv(2) 中的描述進行接收。

實現SOCK_STREAM的通訊協議確保資料不會丟失或重複。如果在合理的時間內無法成功傳輸對等協議具有緩衝區空間的資料片段,則連線被認為已斷開。當在套接字上啟用SO_KEEPALIVE時,協議將以協議特定的方式檢查另一端是否仍然存活。如果程序在斷開的流上傳送或接收,則會引發SIGPIPE訊號;這會導致不處理該訊號的簡單程序退出。SOCK_SEQPACKET套接字採用與SOCK_STREAM套接字相同的系統呼叫。唯一的區別是read(2)呼叫只返回請求的資料量,而到達資料包中剩餘的任何資料都將被丟棄。此外,傳入資料報中的所有訊息邊界都將被保留。

SOCK_DGRAMSOCK_RAW套接字允許將資料報傳送到sendto(2)呼叫中命名的對應者。資料報通常使用recvfrom(2)接收,它返回下一個資料報及其傳送者的地址。

SOCK_PACKET是一種過時的套接字型別,用於直接從裝置驅動程式接收原始資料包。請改用packet(7)。

可以使用fcntl(2) F_SETOWN操作指定一個程序或程序組,當帶外資料到達時接收SIGURG訊號,或者當SOCK_STREAM連線意外中斷時接收SIGPIPE訊號。此操作也可用於設定透過SIGIO接收I/O和I/O事件非同步通知的程序或程序組。使用F_SETOWN等效於使用FIOSETOWNSIOCSPGRP引數的ioctl(2)呼叫。

當網路向協議模組發出錯誤條件訊號(例如,對IP使用ICMP訊息)時,將為套接字設定掛起的錯誤標誌。對該套接字的下一個操作將返回掛起錯誤的錯誤程式碼。對於某些協議,可以啟用每個套接字錯誤佇列以檢索有關錯誤的詳細資訊;請參見ip(7)中的IP_RECVERR

套接字的操作由套接字級別的選項控制。這些選項在<sys/socket.h>中定義。函式setsockopt(2)和getsockopt(2)分別用於設定和獲取選項。

返回值

成功時,返回新套接字的檔案描述符。出錯時,返回-1,並相應地設定errno

錯誤

標籤描述
EACCES 拒絕建立指定型別和/或協議的套接字的許可權。
EAFNOSUPPORT
 實現不支援指定的地址族。
EINVAL 未知協議,或協議族不可用。
EMFILE 程序檔案表溢位。
ENFILE 已達到開啟檔案的系統限制。
ENOBUFSENOMEM
 可用記憶體不足。套接字必須在釋放足夠的資源後才能建立。
EPROTONOSUPPORT
 此域不支援協議型別或指定的協議。
底層協議模組可能會生成其他錯誤。

符合標準

4.4BSD,POSIX.1-2001。socket() 出現在 4.2BSD 中。它通常可以移植到/從支援 BSD 套接字層克隆的非 BSD 系統(包括 System V 變體)。

註釋

在 4.x BSD 下使用的協議族的顯式常量是 PF_UNIX、PF_INET 等,而 AF_UNIX 等用於地址族。但是,BSD 手冊頁已經承諾:“協議族通常與地址族相同”,隨後的標準在任何地方都使用 AF_*。

缺陷

尚未實現SOCK_UUCP

參見

\(lq4.3BSD程序間通訊入門教程\(rq轉載於《UNIX程式設計師補充文檔卷1》。

\(lqBSD程序間通訊教程\(rq轉載於《UNIX程式設計師補充文檔卷1》。


previous next Printer Friendly

廣告


  

廣告



廣告