很多情況下,默認的套接字緩沖區大小可能不夠用。此時,可以將默認的套接字緩沖區大小改成一個更合適的值。
1. 代碼
1 # ! /usr/bin/env python 2 # -*- coding: utf-8 -*- 3 4 import socket 5 6 # 設置發送緩沖域大小 7 SEND_BUF_SIZE = 4096 8 # 設置接收緩沖域大小 9 RECV_BUF_SIZE = 4096 10 11 12 def modify_buff_size(): 13 # 創建TCP socket 14 # UDP socket —— s=socket.socket(socket.AF_INET,SOCK_DGRAM) 15 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 16 17 # 獲取當前套接字關聯的選項 18 # socket.SOL_SOCKET —— 正在使用的socket選項 19 # socket.SO_SNDBUF —— 發送緩沖區大小 20 bsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF) 21 #打印更改前的發送緩沖區大小 22 print("Buffer size [Before]: %d" % bsize) 23 24 # 設置TCP套接字關聯的選項 25 # socket.TCP_NODELAY TCP層套接口選項 26 # 1 —— 表示將TCP_NODELAY標記為TRUE 27 sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1) 28 29 # 設置發送緩沖域套接字關聯的選項 30 sock.setsockopt( 31 socket.SOL_SOCKET, 32 socket.SO_SNDBUF, 33 SEND_BUF_SIZE) 34 35 # 設置接收緩沖域套接字關聯的選項 36 sock.setsockopt( 37 socket.SOL_SOCKET, 38 socket.SO_RCVBUF, 39 RECV_BUF_SIZE) 40 41 # 獲取設置后的發送緩沖域 42 bsize = sock.getsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF) 43 print("Buffer size [After] : %d" % bsize) 44 45 if __name__ == '__main__': 46 modify_buff_size()
2.setsockopt()和getsockopt()
1 def setsockopt(self, level, option, value): # real signature unknown; restored from __doc__ 2 """ 3 setsockopt(level, option, value) 4 5 Set a socket option. See the Unix manual for level and option. 6 The value argument can either be an integer or a string. 7 """ 8 pass 9 10 def getsockopt(self, level, option, buffersize=None): # real signature unknown; restored from __doc__ 11 """ 12 getsockopt(level, option[, buffersize]) -> value 13 14 Get a socket option. See the Unix manual for level and option. 15 If a nonzero buffersize argument is given, the return value is a 16 string of that length; otherwise it is an integer. 17 """ 18 pass 19 后續添加解釋
3.AF_INET和SOCK_STREAM解釋
1 socket.AF_INET —— 服務器之間網絡通信 2 socket.SOCK_STREAM提供有序的、可靠的、雙向的和基於連接的字節流,使用帶外數據傳送機制,為Internet地址族使用TCP。 3 SOCK_STREAM類型的套接口為全雙向的字節流。對於流類套接口,在接收或發送數據前必需處於已連接狀 態。用connect()調用建立與另一套接口的連接,連接成功后,即可用send()和recv()傳送數據。當會話結束后,調用closesocket()。帶外數據根據規定用send()和recv()來接收。
4.運行結果
1 Buffer size [Before]: 65536 2 Buffer size [After] : 4096