socket是用於通訊的工具。
套接字其實是乙個廣義上的程序間通訊的通道。就像pipe一樣,在gun環境下socket也被用乙個檔案表示。不同的socket檔案可以用於不同的程序間通訊,甚至可以用來在網路通訊中不同主機之間的程序間通訊(比如,我們的瀏覽器程序與某台伺服器上監聽80埠的程序通訊完成web請求)。socket是與其他主機通訊的主要手段,相關軟體有telnet
,rlogin
,ftp
,talk
等。
並不是所有的機器都支援socket通訊,不過在gun c庫中,標頭檔案無論是否存在,socket函式總是可用的,不過在機器不支援時,這些函式總會失敗。
1:socket套接字概念
建立套接字時,必須指定通訊方式和通訊型別。建立socket時的協議決定了在套接字上傳送和接收資料時的使用者級別的語義。socket通訊型別回答了一下問題:
資料的傳輸單位是什麼?一些通訊方式將資料視為較大結構的位元組序列;其他人將位元組分組成資料報
資料在正常執行時可能丟失嗎? 一些通訊方式保證傳送的所有資料按照傳送的順序到達(禁止系統或網路崩潰); 其他樣式偶爾會丟失資料作為正常操作部分,有時可能會傳送資料報不止一次或錯誤的順序。設計使用不可靠通訊方式的程式通常需要採取預防措施來檢測丟失或錯誤的資料報,並根據需要重新傳送資料。
是否需要啊建立連線?一些通訊方式要求必須建立起連線通道才可以通訊,有的則不需要。
當建立乙個套接字時,還必須制定乙個namespace,socket("address")也只有在特定命名空間的上下文中才有意義。事實上,甚至資料型別也可能取決於命名空間。命名空間也稱為「域」,也就是domain。但是我們應該避免使用這個詞,因為它可能會與其他感念混淆。每乙個命名空間都有乙個以「pf_」開頭的符號名稱。以「af_」開頭的相應符號名稱指定該命名空間的位址格式。
最後,在建立連線時必須制定使用的協議。該協議確定用於傳送和接收資料的低階機制。每個協議對於特定的命名空間和通訊風格是有效的;命名空間有時被稱為協議族,因為這是為什麼命名空間名稱以「pf_」開頭。
協議的規則適用於兩個程式之間的資料傳遞,也許在不同的計算機上;大多數這些規則由作業系統處理,您不需要知道它們。需要了解的協議是什麼?
為了在兩個socket之間進行通訊,它們必須指定相同的協議。
每個協議對於特定的樣式/命名空間組合是有意義的,不能與不適當的組合一起使用。例如,tcp協議僅適用於通訊的位元組流風格和internet命名空間。
對於風格和命名空間的每個組合,都有乙個預設協議,您可以通過指定0作為協議號來請求。這就是通常應該做的 - 使用預設值。
在以下各個地方的描述中,需要用於表示尺寸的變數/引數。這裡麻煩開始了。在第乙個實現中,這些變數的型別只是int。在當時的大多數機器上,乙個int是32位寬,這建立了乙個事實上的標準,需要32位變數。這是重要的,因為這種型別的變數的引用被傳遞給核心。
然後,posix組織來到並統一了介面,其中的「所有大小的值都是size_t」。在64位機器上,size_t是64位寬,所以不能再指向變數。
unix98規範通過引入乙個型別socklen_t來提供乙個解決方案。在posix更改為使用size_t的所有情況下都使用此型別。這種型別的唯一要求是它是至少32位的無符號型別。因此,需要傳遞對32位變數的引用的實現可以像使用64位值的實現。
2:通訊方式
gun c庫包括對不同套接字的支援,每個套接字有不同的屬性。以下符號常量在中定義
巨集:int sock_stream:這種方式就像是pipes和fifos
巨集:int sock_dgram:用於不可靠的傳送單獨定址的資料報,與sock_stream相反。每次向這種套接字寫入資料時,該資料都會被打包成乙個資料報。由於sock_dgram套接字沒有連線,因此必須在每個資料報指定收件人位址。
巨集:int sock_raw:這種風格提供對低階網路協議和介面的訪問。普通使用者程式通常不需要使用這種風格。
套接字的名稱通常稱為位址。用於處理套接字位址的函式和符號名稱不一致。有事使用術語「名稱」,有時稱為「位址」。可以講這些視為同義詞。
使用socket函式建立乙個套接字時沒有位址,其他程序只有給它乙個位址時才可以找到與它通訊。我們將這個過程稱為繫結到套接字,在c用使用bind函式實現。
只需要關心套接字的位址,如果其他程序要找到它並開始與其通訊。可以指定其他套接字的位址,但這通常是無意義的;首次從套接字傳送資料,或者使用它來啟動連線時,如果沒有指定乙個位址,系統會自動分配乙個位址。
偶爾,客戶端需要指定位址,因為伺服器基於位址進行區分;例如,rsh和rlogin協議檢視客戶端的套接字位址,只有在小於ipport_reserved(請參閱埠)時才會旁路密碼檢查。
關於命名空間可以查閱local namespace和internet namespace。無論命名空間如何,都是用相同的bind、getsocketname來設定乙個套接字的位址。在實際中,位址格式存在一些特定的資料結構中,當bind時將其轉換為struct sockaddr *。
GUN C中的錯誤報告
在c語言中,很多庫函式在呼叫失敗時都會返回特定的值。比如返回 1,空指標,eof等。但是這些值僅僅表示的呼叫失敗,並未給出詳細的錯誤資訊。如果想檢視詳細的錯誤內容,就要去檢視errno的錯誤 errno在errno.h中定義。關於errno的解釋 乙個int型別,可修改的左值 errno包含了系統中...
Socket的學習 一
應用層通過傳輸層進行資料通訊時,tcp和udp會遇到同時為多個應用程式程序提供併發服務的問題.多個tcp連線或多個應用程式程序可能需要通過同乙個tcp協議埠傳輸資料.為了區別不同的應用程式程序和連線,許多計算機作業系統為應用程式與tcp ip協議互動提供了稱為套接字 socket 的介面,區分不同應...
socket學習 一 socket模組屬性
屬性名稱 描述資料屬性 af unix af inet af inet6 af netlink af tipc python 中支援的套接字位址家族 so stream so dgram 套接字型別 tcp 流,udp 資料報 has ipv6 指示是否支援 ipv6 的布林標記 異常error 套...