Python里disconnect UDP套接字的方法,pythondisconnect
Python里disconnect UDP套接字的方法,pythondisconnect
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中使用PyQt把网页转换成PDF操作代码实例,pythonpy
- Python实现的飞速中文网小说下载脚本,
- Python3里的super()和__class__使用介绍,python3__class_
- Python实现对比不同字体中的同一字符的显示效果,pyt
- Python实现把回车符\r\n转换成\n,python
- Python实现计算文件夹下.h和.cpp文件的总行数,
- python打开文件并获取文件相关属性的方法,
- python输出指定月份日历的方法,python输出月份日历
- python实现在每个独立进程中运行一个函数的方法,pyt
- 在Python中测试访问同一数据的竞争条件的方法,python竞
评论关闭