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 婆婆高寿祝福语大全简短