Python里disconnect UDP套接字的方法
UDP套接字是可以使用connect系统调用连接到指定的地址的。从此以后,这个套接字只会接收来自这个地址的数据,而且可以使用send系统调用直接发数据而不用指定地址。可以再次调用connect来连接到别的地方。但是在Python里,一旦调用connect之后,就再也回不到最初的能够接收从任意地址来的数据的状态了!
这是Python的API限制,没办法给connect方法传递到AF_UNSPEC地址簇(在C代码里写死了的)。C里边就可以做到的(代码来自这里):
intdisconnect_udp_sock(intfd){
structsockaddr_insin;
memset((char*)&sin,0,sizeof(sin));
sin.sin_family=AF_UNSPEC;
return(connect(fd,(structsockaddr*)&sin,sizeof(sin)));
}
不过既然是Python的限制,拿ctypes就可以绕过了嘛,有些麻烦就是了:
fromctypesimportCDLL,create_string_buffer
defdisconnect(sock):
libc=CDLL("libc.so.6")
buf=create_string_buffer(16)#sizeofstructsockaddr_in
libc.connect(sock.fileno(),buf,16)
AF_UNSPEC的值是0,所以把一个和structsockaddr_in一样长的全零缓冲区传给connect就可以了:-)
热门推荐
1 训练狗狗憋尿
2 狗狗追踪训练
3 狗狗训练要多少钱
5 深圳狗狗训练
6 训练狗狗唤回
7 狗狗叫怎么训练
8 狗狗训练班
10 狗狗社会化训练
11 狗狗叫回训练
12 广州狗狗训练学校
13 狗狗训练躺下
14 狗狗随行训练
15 训练狗狗巡回
16 狗狗要怎么训练
17 狗狗喂食训练
18 训练狗狗躺下