python3套接字udp设置接受数据超时

Python09

python3套接字udp设置接受数据超时,第1张

Sometimes,you need to manipulate the default values of certain properties of a socket library, for example, the socket timeout.

设定并获取默认的套接字超时时间。

1.代码

1 import socket

2

3

4 def test_socket_timeout():

5 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

6 print("Default socket timeout: %s" % s.gettimeout())

7 # 获取套接字默认超时时间

8 s.settimeout(100)

9 # 设置超时时间

10 print("Current socket timeout: %s" % s.gettimeout())

11 # 读取修改后的套接字超时时间

12

13

14 if __name__ == '__main__':

15 test_socket_timeout()

2. AF_INET和SOCK_STREAM解释

1 # 地址簇

2 # socket.AF_INET IPv4(默认)

3 # socket.AF_INET6 IPv6

4 # socket.AF_UNIX 只能够用于单一的Unix系统进程间通信

5

6 # socket.SOCK_STREAM(数据流) 提供面向连接的稳定数据传输,即TCP/IP协议.多用于资料(如文件)传送。

3.gettimeout()和settimeout()解释

1 def gettimeout(self): # real signature unknownrestored from __doc__

2 """

3 gettimeout() ->timeout

4

5 Returns the timeout in seconds (float) associated with socket

6 operations. A timeout of None indicates that timeouts on socket

7 operations are disabled.

8 """

9 return timeout

10

11

12 def settimeout(self, timeout): # real signature unknownrestored from __doc__

13 """

14 settimeout(timeout)

15

16 Set a timeout on socket operations. 'timeout' can be a float,

17 giving in seconds, or None. Setting a timeout of None disables

18 the timeout feature and is equivalent to setblocking(1).

19 Setting a timeout of zero is the same as setblocking(0).

20 """

21 pass

22 # 设置套接字操作的超时期,timeout是一个浮点数,单位是秒。值为None表示没有超时期。

23 # 一般,超时期应该在刚创建套接字时设置,因为它们可能用于连接的操作(如 client 连接最多等待5s )

4.运行结果

1 Default socket timeout: None

2 Current socket timeout: 100.0

使用socket.setsockopt()和SO_SNDBUF:

socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, <value>)

<value>是要设置为Python的缓冲区大小。int。

socket.setsockopt(socket.SOL_SOCKET, socket.SO_SNDBUF, 8192) # Buffer size 8192

socket(family,type[,protocal]) 使用给定的地址族、套接字类型、协议编号(默认为0)来创建套接字。

有效的端口号: 0~ 65535

但是小于1024的端口号基本上都预留给了操作系统

POSIX兼容系统(如Linux、Mac OS X等),在/etc/services文件中找到这些预留端口与的列表

面向连接的通信提供序列化、可靠的和不重复的数据交付,而没有记录边界。意味着每条消息都可以拆分多个片段,并且每个消息片段都能到达目的地,然后将它们按顺序组合在一起,最后将完整的信息传递给等待的应用程序。

实现方式(TCP):

传输控制协议(TCP), 创建TCP必须使用SOCK_STREAM作为套接字类型

因为这些套接字(AF_INET)的网络版本使用因特网协议(IP)来搜寻网络中的IP,

所以整个系统通常结合这两种协议(TCP/IP)来进行网络间数据通信。

数据报类型的套接字, 即在通信开始之前并不需要建议连接,当然也无法保证它的顺序性、可靠性或重复性

实现方式(UDP)

用户数据包协议(UDP), 创建UDP必须使用SOCK_DGRAM (datagram)作为套接字类型

它也使用因特网来寻找网络中主机,所以是UDP和IP的组合名字UDP/IP

注意点:

1)TCP发送数据时,已建立好TCP连接,所以不需要指定地址。UDP是面向无连接的,每次发送要指定是发给谁。

2)服务端与客户端不能直接发送列表,元组,字典。需要字符串化repr(data)。

TCP的优点: 可靠,稳定 TCP的可靠体现在TCP在传递数据之前,会有三次握手来建立连接,而且在数据传递时,有确认、窗口、重传、拥塞控制机制,在数据传完后,还会断开连接用来节约系统资源。

TCP的缺点: 慢,效率低,占用系统资源高,易被攻击 TCP在传递数据之前,要先建连接,这会消耗时间,而且在数据传递时,确认机制、重传机制、拥塞控制机制等都会消耗大量的时间,而且要在每台设备上维护所有的传输连接,事实上,每个连接都会占用系统的CPU、内存等硬件资源。 而且,因为TCP有确认机制、三次握手机制,这些也导致TCP容易被人利用,实现DOS、DDOS、CC等攻击。

什么时候应该使用TCP : 当对网络通讯质量有要求的时候,比如:整个数据要准确无误的传递给对方,这往往用于一些要求可靠的应用,比如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTP等邮件传输的协议。 在日常生活中,常见使用TCP协议的应用如下: 浏览器,用的HTTP FlashFXP,用的FTP Outlook,用的POP、SMTP Putty,用的Telnet、SSH QQ文件传输.

UDP的优点: 快,比TCP稍安全 UDP没有TCP的握手、确认、窗口、重传、拥塞控制等机制,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的这些机制,UDP较TCP被攻击者利用的漏洞就要少一些。但UDP也是无法避免攻击的,比如:UDP Flood攻击……

UDP的缺点: 不可靠,不稳定 因为UDP没有TCP那些可靠的机制,在数据传递时,如果网络质量不好,就会很容易丢包。

什么时候应该使用UDP: 当对网络通讯质量要求不高的时候,要求网络通讯速度能尽量的快,这时就可以使用UDP。 比如,日常生活中,常见使用UDP协议的应用如下: QQ语音 QQ视频 TFTP ……