Python里disconnect UDP套接字的方法
作者:junjie 时间:2023-03-26 02:48:00
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,套接字
0
投稿
猜你喜欢
Redis中3种特殊的数据类型(BitMap、Geo和HyperLogLog)
2024-01-24 11:20:47
编写python程序的90条建议
2022-04-30 00:36:22
python视频按帧截取图片工具
2021-09-08 10:30:56
基于python检查SSL证书到期情况代码实例
2023-06-26 06:23:58
django框架如何集成celery进行开发
2022-09-13 11:18:24
Perl使用Tesseract-OCR实现验证码识别教程
2022-04-22 07:52:05
Python实现的根据文件名查找数据文件功能示例
2022-05-13 17:47:40
ASP访问带多个参数的存储过程
2008-10-14 16:45:00
如何才能有效对抗MySQL数据库的解密高手
2009-05-22 18:21:00
oracle 存储过程加密的方法
2009-03-06 10:58:00
python分割一个文本为多个文本的方法
2022-09-01 06:40:33
段正淳的css笔记(1)分类之间的横竖线
2007-11-01 21:47:00
Pandas之ReIndex重新索引的实现
2023-10-22 20:47:28
php字符串使用详细了解
2023-06-06 04:19:07
python使用cPickle模块序列化实例
2022-06-26 22:35:09
在网页中显示可拖动月历
2010-07-13 12:09:00
python学习教程之Numpy和Pandas的使用
2022-12-14 12:41:06
JavaScript 日期联动选择器
2010-08-01 10:18:00
Python图像处理模块ndimage用法实例分析
2023-09-08 16:52:26
深入了解Python的类与模块化
2021-04-18 11:28:29