socket其他属性
s.fileno() 获取套接字的文件描述符 0, 1, 2 表示标准输入,标准输出,错误输出
*描述符: 每个IO操作,系统都会分配一个不同的证书与之对应,该数即为此IO的描述符
s.type 打印套接字的类型
s.getsockname() 获取绑定的地址
s.getpeername() 打印客户端的地址和端口
s.setsockopt(level, optname, value) 设置套接字选项s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
s.getsockopt(level, optname) 获取套接字选项值
UDP应用之广播
要讲套接字设置为允许接收广播
如果要发送广播,即发送给广播地址: x.x.x.255
广播风暴: 当在一个网络中大量发送广播会占用大量带宽
下面实现udp广播小程序:
接收端程序:
from socket import *
HOST = ''
PORT = 9999
s = socket(AF_INET, SOCK_DGRAM)
#设置套接字,让其允许接收广播
s.setsockopt(SOL_SOCKET, SO_BROADCAST,1)
#设置可以socket释放后可以立即重用
s.setsockopt(SOL_SOCKET, SO_REUSEADDR,1)
#固定接收端的端口号;
s.bind((HOST,PORT))
while True:
try:
message,addr = s.recvfrom(4096)
print("from {} copy message:{}".format(addr, message.decode()))
s.sendto("copy......".encode(), addr)
except (KeyboardInterrupt, SyntaxError):
raise
except Exception as e:
print(e)
s.close()
广播发送端程序:
from socket import *
from time import sleep
#发送广播的地址
dest = ('192.168.10.255',9999)
s = socket(AF_INET,SOCK_DGRAM)
s.setsockopt(SOL_SOCKET, SO_BROADCAST,1)
while True:
sleep(1)
s.sendto('I love China....'.encode(), dest)
data, addr = s.recvfrom(1024)
print("Received from {}, Data:{}".format(addr, data.decode()))
s.close()
效果:
from ('192.168.10.11', 38036) copy message:I love China....
from ('192.168.10.11', 46767) copy message:I love China....
from ('192.168.10.11', 46767) copy message:I love China....
from ('192.168.10.11', 46767) copy message:I love China....
from ('192.168.10.11', 46767) copy message:I love China....
from ('192.168.10.11', 46767) copy message:I love China....
from ('192.168.10.11', 46767) copy message:I love China....