您好,登錄后才能下訂單哦!
本篇內容介紹了“什么是socket套接字”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
客戶端-服務器模型
互聯網已經深入我們生活的方方面面,重要性不言而喻。上世紀70年代互聯網剛發明的時候,就確定了客戶端-服務器模型,這個編程模型一直沿用到現在都沒有變過,我們在電腦上打開一個網站,在微信上聊天,打開一個app本質上都是客戶端和服務器的連接和交互。
客戶端-服務器模型的操作方式如下:
客戶端需要一個服務的時候,比如需要打開一個網頁,它就向服務器發送一個請求。
服務器收到請求后,會進行適當的處理,比如從數據庫讀取客戶端需要的數據。
服務器處理好請求后,會按一定的格式返回客戶端需要的數據,然后發給客戶端一個響應。
客戶端收到服務器的響應后,會處理網頁數據,然后再顯示器上顯示出來,然后客戶端再發送請求給服務器,如此循環。
socket 套接字
客戶端和服務器是通過什么來連接的呢?是20 世紀 80 年代加州大學伯克利分校提出來的socket套接字,也叫伯克利套接字。socket的工作模式如下圖:
服務器socket準備工作:
初始化socket
執行bind綁定操作,將服務器的服務綁定在一個ip地址和一個特定的端口上
執行listen操作,將原先的socket轉化為服務端的socket
執行accept操作,將進程阻塞在accept方法上,等待客戶端的連接
客戶端初始化一個socket后,可以直接調用connet方法連接服務端的socket,經過著名的TCP三次握手,客戶端和服務器建立連接,進入數據傳輸狀態。
客戶端發起write寫操作,服務器通過read接收數據,然后write到客戶端,客戶端用read接收數據,當客戶端和服務器交互完成之后,客戶端發起close操作,發送一個FIN包通知服務器關閉鏈接。
socket 套接字地址格式
客戶端和服務器建立連接的時候,需要知道對方的地址。就像快遞小哥要給你送快遞就得知道你家住那棟樓,哪個房間一樣。互聯網世界的ip地址和端口就像哪棟樓幾零幾一樣,能夠精確的找到服務器上的某個服務。
我們使用socket的時候就需要對方的ip地址和端口號,socket的地址結構在程序里的表示如下面的圖示。
sin_family表示地址的類型,IPv4的值就是AF_INET,IPv6的值就是AF_INET6,程序通過sin_family的類型就可以知道該套接字地址是哪種類型了。
in_port_t表示端口號,我們看到端口號占16位,所以端口號的數量最大支持2的16次方,就是65536個端口,也就是0~65535的范圍。因為每次建立連接的時候都需要知道對方的端口號,很多知名的服務就把自己的端口號固定了,叫做保留端口。這樣客戶端要連接這些服務的時候就知道用哪個端口了,不用每次再去問了,比如:ftp的21端口,ssh的22端口,telnet的23端口,http的80端口。
通用套接字地址格式
IPv4 套接字格式地址
IPv6 套接字地址格式
本地套接字地址格式
幾種套接字地址格式比較
通用套接字地址
IPv4套接字格式地址表示IPv4的地址,IPv6套接字格式地址表示IPv6的地址,還有本地地址結構用于本地 socket 通信,還有一個是通用地址結構,為什么要有通用地址結構呢?
原來為了方便函數的的調用,像connect,bind,accept方法都需要一個套接字地址結構的指針參數:
為了方便起見,函數的定義就直接用通用的地址結構指針定義,然后調用的時候再傳入具體的地址結構指針,有沒有和面向對象編程的多態特性很像?
但是ipv4地址結構的大小為16字節,ipv6地址結構的大小為28字節,本地地址地址結構的大小最多為110字節,而通用地址結構的大小為16字節。除了ipv4地址,其他地址都比通用地址結構大,那么其他地址是如果轉換為通用地址的呢?
仔細看一下,這里參數傳入的是地址結構的指針哦,后面還有一個*addrlen的參數,表示地址結構的長度,所以只要取addrlen長度的數據就行了,具體的類型可以根據sin_family來確定哦。
“什么是socket套接字”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。