python-socket模塊


socket

1.定義:

  socket又稱為“套接字”,應用程序通常通過套接字向網絡發去請求,或者應答網絡請求,使主機之間或者一台計算機中的進程可以通訊。

2.創建:

   創建套接字 

1 import socket
2  
3 my_socket = socket.socket(family=AF_INIT, type=SOCK_STREAM, proto=0, fileno=None) 

【參數】family:AF_INIT(IPv4地址族, 默認)  
                          AF_INET6(IPv6地址族) 

                          AF_UNIX(Unix地址族) 

                          AF_CAN(CAN總線)                                  

                          AF_RDS(汽車等移動收音)

              type:SOCK_STREAM(流服務,默認,傳輸層TCP)

                      SOCK_DGRAM(數據包,傳輸層UDP)

                      SOCK_RAW(原始套接字,用來自行組裝數據包)

              proto:一般不填寫,默認為0

                          當family=AF_CAN, proto則為CAN_RAW或者CAN_BCM

             返回值:<class 'socket.socket'>

3.socket對象方法:

  

my_socket.bind(address, port):將套接字綁定到地址,address格式取決於地址族。AF_INET下,以(host, port)元組(host為str格式,port為int格式,組成元組)表示。address一般寫空字符串,監聽任意IP地址,后面端口自己設置,監聽所有自己設置端口的任意IP地址發送的請求連接。

my_socket.listen(backlog):啟動服務器以接收連接。backlog為拒絕連接之前可連接的最大數量,至少為0

# backlog 代表着有多少個已經建立的但是沒有被 accept 取走的連接數量。

另外,有個內核參數 net.core.somaxconn 定義了 socket 同時 listen 的最大連接數,所以 socket.listen() 指定的值不能超過 net.core.somaxconn。

# (不常用)my_socket.setblocking(bool):默認值為True,如果設置False,recv()或者accept()無數據,則報錯

my_socket.accept():服務器接收客戶端連接。返回(cli_connect_address, port)  # cli_connect_socket:client_connect_socket:客戶端套接字,

# (不常用)socket.gethostname():返回python解釋器當前運行的主機名

cli_socket.connect(address):客戶端連接服務器。address格式取決於地址族。默認以address = (hostname, post),hostname為本機主機名,post為代連接服務器端口。

cli_socket.connect_ex(address):同上。只不過會有返回值。連接失敗返回0,成功返回編碼

my_socket.close()/cli_socket.close():關閉套接字。

s_cli_socket.recv(buffersize, flag):接收套接字數據。返回字符串,buffersize為最多接收的數量。

s_cli_socket.recvfrom(buffersize, flag):同上。返回(data, address),address為與之連接的地址。flag可省略。

s_cli_socket.send(string, flag):服務器接收連接后,向客戶端發送數據。string可以為空。

sk.sendall(string, flag):向客戶端發送全部數據。內部遞歸調用send(),成功返回None,失敗拋出異常

sk.sendto(string[,flag],address):將數據發送到套接字,address是形式為(ipaddr,port)的元組,指定遠程地

址。返回值是發送的字節數。該函數主要用於UDP協議。

sk.settimeout(timeout):設置套接字操作的超時期,timeout是一個浮點數,單位是秒。值為None表示沒有超時

期。一般,超時期應該在剛創建套接字時設置,因為它們可能用於連接的操作(如 client 連接最多等待5s )

sk.getpeername():返回連接套接字的遠程地址。返回值通常是元組(ipaddr,port)。

sk.getsockname():返回套接字自己的地址。通常是一個元組(ipaddr,port)

sk.fileno():套接字的文件描述符

se_socket.setsockopt(level, optname, value):設置給定套接字選項的值。level定義那個選項將被使用,通常為

SOL_SOCKET(正在使用的socket選項);當level=SOL_SOCK時,optname為下列值:

選項 定義
SO_BINDTODEVICE 可以使socket只在某個特殊的網絡接口(網卡)有效。也許不能是移動便攜設備 一個字符串給出設備的名稱或者一個空字符串返回默認值
SO_BROADCAST 允許廣播地址發送和接收信息包。只對UDP有效。如何發送和接收廣播信息包 布爾型整數
SO_DONTROUTE 禁止通過路由器和網關往外發送信息包。這主要是為了安全而用在以太網上UDP通信的一種方法。不管目的地址使用什么IP地址,都可以防止數據離開本地網絡 布爾型整數
SO_KEEPALIVE 可以使TCP通信的信息包保持連續性。這些信息包可以在沒有信息傳輸的時候,使通信的雙方確定連接是保持的 布爾型整數
SO_OOBINLINE 可以把收到的不正常數據看成是正常的數據,也就是說會通過一個標准的對recv()的調用來接收這些數據 布爾型整數
SO_REUSEADDR 當socket關閉后,本地端用於該socket的端口號立刻就可以被重用。通常來說,只有經過系統定義一段時間后,才能被重用。 布爾型整數

 

 

 

 

 

 

 

 

 

 

ser_socket.getsockopt(level, optname, [buflen]):返回套接字選項的值(bytes)。

ser_socket.makefile(mode='r', buffering=None, *, encoding=None, errors=None, newline=None):創建一個與該套接字相關聯的文件,且該套接字必須處於阻塞模式,mode取值與內置的open()函數相同。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM