socket即套接字,是用來創建網絡通訊鏈接的基礎,大量的應用程序都是經過套接字來實現網絡通訊,諸如HTTP瀏覽器、RPC通訊、FTP下載等。html
常見的TCP鏈接使用socket的通訊原語,如bind/listen/accept/connect/recv/sendall等,這裏我不會介紹以上通用的原語,咱們講講一些其餘的配置。python
創建socket使用socket.socket(socket.AF_INET, socket.SOCK_STREAM)
。瀏覽器
其中第一個參數爲協議族,約定了socket的地址類型;第二個參數爲socket類型,指定了面向協議的類型;其實還有第三個隱藏的參數,用來指定協議類型,但一般爲0,這使得第二個參數能夠自動選擇對應socket的內置協議。服務器
import socket for af in iter(i for i in dir(socket) if i.startswith('AF_')): print(af)
協議族有socket.AF_INET
,socket.AF_INET6
,還有其餘依賴於操做系統的協議族,能夠經過上面的代碼查看。網絡
import socket for sk in iter(i for i in dir(socket) if i.startswith('SOCK_')): print(sk)
socket類型通用的有socket.SOCK_STREAM
,socket.SOCK_DGRAM
,前者用於TCP鏈接,後者用於UDP鏈接,還有其它的依賴於操做系統的socket類型,經過上面代碼查看。dom
socket.setsockopt(level, optname, value)
,相關level和optname能夠在查看<socket.h>文件或這裏socket
level有一個經常使用的常量,SOL_SOCKET
,是套接字級別的設置,而非協議層級別。操作系統
選擇該level後可選設置有不少,用以下代碼看下有哪些常量。code
import socket for consts in iter(i for i in dir(socket) if i.startswith('SO_'))): print(consts)
其值類型爲布爾型整數(0或1),表示當socket斷開鏈接後是否當即釋放端口,默認爲0,因此有時重啓我的服務器會出現socket端口占用的異常,這是由於系統會自動保留一段時間socket端口。htm
import socket sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind((ip or domain, port))
值類型布爾型整數,用於心跳檢測(TCP協議棧四層),但只能檢測鏈接是否存活,不能檢測是否可用,而且網絡故障致使的信息重傳優先級比檢測包高,會出現延時。
結論就是很差用,不如應用層的心跳檢測。