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就可以了:-)