Sockethtml
Socket 簡介git
Socket起源於 20 世 紀 80 年代早期,最先由 4.1c BSD UNIX 引入,因此也稱之爲「BSD Socket 或者 Berkeley Socket」。BSD Socket 是事實上的網絡應用編程接口標準,其它編程語言每每也是用與這套(用C寫成的編程接口)相似接口。程序員
用 Socket 可以實現網絡上的不一樣主機之間或同一主機的不一樣對象之間的數據通訊。因此,如今 Socket 已是一類通用通訊接口的集合。github
大的類型能夠分爲網絡 Socket 和本地 Socket 兩種。編程
本地上的兩個進程如何通訊?網絡
內存共享(munmap());socket
消息和隊列;編程語言
管道(匿名管道pipe()和命名管道mkfifo());測試
信號量(P V操做);url
RPC remote protocol control
本地Socket;
網路上的兩個進程如何通訊?
本地進程間通訊(IPC)經過PID(在終端中輸入ps -ef可查看PID)能夠惟一肯定彼此,而後經過共享內存,消息隊列來通;網絡上的兩個進程肯定彼此須要IP與端口號,經過傳輸層(TCP/UDP)協議進行通訊;
這就是網絡 Socket 。
socket能夠理解爲:在TCP/UDP 加一個端口(在網卡註冊的,還記得吧)綁定。
網路socket和 本地 Socket對比
在同一個設備上,兩個進程若是須要進行通信最基本的一個前提能可以惟一的標示一個進程,在本地進程通信中可使用PID來惟一標示一個進程;
PID只在本地惟一,網絡中的兩個進程PID衝突概率很大,此時顯然不行了,怎麼辦?
IP層的ip地址能夠惟一標示主機,而TCP層協議和端口號能夠惟一標示主機的一個進程,因此能夠利用ip地址+協議+端口號惟一標示網絡中的一個進程。
Socket通訊就是一種肯定了端口號的TCP/IP通訊,或者說Socket通訊與IP通訊差異就是端口肯定,協議肯定。
用一張圖表達一下:
Socket.png
端口的打開是雙方的,在C/S(Client&&Server)結構的TCP鏈接中不單單要注意到S的端口(監聽的),實際上C也開了一個端口,而C端的端口是動態端口,TCP鏈接創建的時候,C端的端口會在三次握手結束後肯定,動態打開一個,這個端口不受用戶/程序員的控制。
Socket C 端書寫步驟
建立ke戶端Socket
建立fu務器Socket
鏈接到fu務器(Socket編程)
發送數據給fu務器
接收fu務器返回的數據
關閉Socket : close(socketNumber)
一張經典的Socket C/S的步驟圖。
Socket.jpg
按照上面步驟就能夠寫一個socket的通訊的小demo:
寫好的已經放在了個人github;
此時沒有寫fu務端,怎麼測試?
可利用:nc -lk 端口號:始終監聽本地計算機此端口的數據。
eg:nc -lk 6666;
操做步驟gif
監聽 6666端口
connettion;
發送socket;fu務器接收到socket;
fu務端send :hello socket;
操做步驟.gif
S端socket通訊步驟
提供一些fu務
將這個fu務與本身的IP地址、端口綁定
監放任何到這個IP+端口的TCP請求
接受/拒絕創建這個TCP鏈接
讀寫
斷開TCP鏈接
socketfu務端下次再談!以上就是本次回顧。