網路程式設計中的套接字系統呼叫socket()用來獲得檔案描述符。
socket()函式的原型如下:
int socket( int domian, int type, int protocol);
這個函式建立乙個協議族為domain、協議型別type、協議編號為protocol的套接字檔案描述符。如果函式呼叫成功,會返回乙個表示這個套接字的檔案描述符,失敗的時候返回-1。
函式socket()的引數domain用於設定網路通訊的域,函式socket()根據這個引數選擇通訊協議的族。通訊協議族在檔案sys/socket.h中定義,包含如表所示的值,在標頭檔案中af_inet和pfinet的值是一致的。
sock_stream
tcp連線,提供序列化、可靠的、雙向連線的位元組流。支援帶外資料
sock_dgram
支援udp連線(無連線狀態的訊息)
sock_seqpacket
序列化包,提供乙個序列化的、可靠的、雙向的基於連線的資料傳輸通道,資料長度定常。每次呼叫讀系統呼叫時資料需要將全部資料讀出。
sock_raw
raw型別,提供原始網路協議訪問
sock_rdm
提供可靠的資料報文,不過可能資料會有亂序
sock_packet
這是乙個專用型別,不能在通用程式中使用
並不是所有的協議族都實現了這些協議型別,例如,af_inet協議族就沒有實現sock_seqpacket協議型別。
函式socket()的第三個引數protocol用於指定某個協議的特定型別,即type型別中的某個型別。通常某個協議中只有一種特定型別,這樣protocol引數僅能設定為0;但是有些協議有多種特定的型別,就需要設定這個引數來選擇特定的型別。
函式socket()並不總是執行成功,有可能會出現錯誤,錯誤的產生有多種原因,可以通過errno獲得,具體值和含義在如下表中列出。通常情況下造成函式socket()失敗的原因是輸入的引數錯誤造成的,例如某個協議不存在等,這時需要詳細檢查函式的輸入引數。由於函式的呼叫不一定成功,在進行程式設計的時候,一定要檢查返回值。值含義
eacces
沒有許可權建立指定domain的type的socket
eafnosupport
不支援所給的位址型別
einval
不支援次協議或者協議不可用
emfile
程序檔案表溢位
enfile
已經達到系統允許開啟的檔案數量,開啟檔案過多
enobufs/enomem
記憶體不足。socket只有到資源足夠或者有程序釋放記憶體
eprotonosupport
指定的協議type在domain中不存在
其他使用socket()函式的時候需要設定上述3個函式,例如將socket()函式的第乙個引數domain設定為af_inet,第二個引數設定為sock_stream,第三個引數設定為0,建立乙個流式套接字。
int sock = socket(af_inet,sock_steam,0);
socket()函式和核心函式之間的關係
使用者設定套接字的引數後,函式要能夠起作用,需要與核心空間的相關系統呼叫互動。應用層的socket()函式是和核心層的系統呼叫相對應的。
圖中使用者呼叫函式sock=socket(af_inet,sock_stream,0),這個函式會呼叫系統呼叫函式sys_socket(af_inet,sock_stream,0)(在檔案net/socket.c中)。系統呼叫sys_socket()分為兩部分,一部分生成核心socket結構(注意與應用層的socket函式是不同的),一部分與檔案描述符繫結,將繫結的檔案描述符值傳給應用層。核心sock結構如下(在檔案linux/net.h中);
核心函式sock_create()根據使用者的domain指定的協議族,建立乙個核心socket結構繫結到當前的程序上,其中的type與使用者空間使用者的設定值是相同的。
sock_map_fd()函式將socket結構與檔案描述符列表中的某個檔案描述符繫結,之後的
操作可以查詢檔案描述符列表來對應核心socket結構。
socket的accept函式解析
今天與同學爭執乙個話題 由於socket的accept函式在有客戶端連線的時候產生了新的socket用於服務該客戶端,那麼,這個新的socket到底有沒有占用乙個新的埠?討論完後,才發現,自己雖然熟悉socket的程式設計套路,但是卻並不是那麼清楚socket的原理,今天就趁這個機會,把有關sock...
解析socket程式設計的相關函式
1.什麼是套接字 乙個完整的網路通訊需要乙個五元組來標識 協議 本地位址 本地埠號 遠端位址 遠端埠號。tcp用主機的ip位址加上主機上的埠號作為tcp連線的端點,這種端點就叫做套接字 流式套接字 sock stream tcp the transmission control protocol 協...
iOS byte擷取 socket解析
細節學習 ios byte陣列的 擷取 socket資料解析 最近在做socket長連線。遇見一些問題,希望給各位磚友一些參考的資訊 遇見的第乙個問題 返回的socket資料用nsasciistringencoding 字母解析沒有問題。但是 中文字母就是亂碼。這個問題是由於你socket資訊的編碼...