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就可以了:-)
热门推荐
10 五一公司放假祝福语简短
11 追星女孩的祝福语简短
12 给长辈端午祝福语 简短
13 生日祝福语有诗意简短
14 团圆日祝福语简短
15 中秋商务祝福语简短最新
16 温暖文艺简短祝福语短句
17 男孩上学祝福语简短的
18 入住酒店文案祝福语简短