手机
当前位置:查字典教程网 >脚本专栏 >python >Python里disconnect UDP套接字的方法
Python里disconnect UDP套接字的方法
摘要:UDP套接字是可以使用connect系统调用连接到指定的地址的。从此以后,这个套接字只会接收来自这个地址的数据,而且可以使用send系统调用...

UDP 套接字是可以使用 connect 系统调用连接到指定的地址的。从此以后,这个套接字只会接收来自这个地址的数据,而且可以使用 send 系统调用直接发数据而不用指定地址。可以再次调用 connect 来连接到别的地方。但是在 Python 里,一旦调用 connect 之后,就再也回不到最初的能够接收从任意地址来的数据的状态了!

这是 Python 的 API 限制,没办法给 connect 方法传递到 AF_UNSPEC 地址簇(在 C 代码里写死了的)。C 里边就可以做到的(代码来自这里):

复制代码 代码如下:

int disconnect_udp_sock(int fd) {

struct sockaddr_in sin;

memset((char *)&sin, 0, sizeof(sin));

sin.sin_family = AF_UNSPEC;

return (connect(fd, (struct sockaddr *)&sin, sizeof(sin)));

}

不过既然是 Python 的限制,拿 ctypes 就可以绕过了嘛,有些麻烦就是了:

复制代码 代码如下:

from ctypes import CDLL, create_string_buffer

def disconnect(sock):

libc = CDLL("libc.so.6")

buf = create_string_buffer(16) # sizeof struct sockaddr_in

libc.connect(sock.fileno(), buf, 16)

AF_UNSPEC 的值是 0,所以把一个和 struct sockaddr_in 一样长的全零缓冲区传给 connect 就可以了 :-)

【Python里disconnect UDP套接字的方法】相关文章:

Python调用C/C++动态链接库的方法详解

Python获取脚本所在目录的正确方法

python二叉树遍历的实现方法

python中使用urllib2伪造HTTP报头的2个方法

python批量下载图片的三种方法

python爬取网站数据保存使用的方法

Python批量修改文件后缀的方法

python函数返回多个值的示例方法

python连接sql server乱码的解决方法

Python 开发Activex组件方法

精品推荐
分类导航