socket模塊

socket模塊

簡介

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的內置協議。服務器

AddressFamily

import socket

for af in iter(i for i in dir(socket) if i.startswith('AF_')):
    print(af)

協議族有socket.AF_INETsocket.AF_INET6,還有其餘依賴於操做系統的協議族,能夠經過上面的代碼查看。網絡

SocketKind

import socket

for sk in iter(i for i in dir(socket) if i.startswith('SOCK_')):
    print(sk)

socket類型通用的有socket.SOCK_STREAMsocket.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)

SO_REUSEADDR

其值類型爲布爾型整數(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))

SO_KEEPALIVE

值類型布爾型整數,用於心跳檢測(TCP協議棧四層),但只能檢測鏈接是否存活,不能檢測是否可用,而且網絡故障致使的信息重傳優先級比檢測包高,會出現延時。

結論就是很差用,不如應用層的心跳檢測。

相關文章
相關標籤/搜索