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
投稿
猜你喜欢
MySQL数据库中使用GRANT语句增添新用户
2008-12-17 14:45:00
Golang通脉之数据类型详情
2023-07-14 05:37:03
Python实现的求解最小公倍数算法示例
2022-12-11 04:50:03
从SNS看社会化界面设计 I
2009-02-19 12:21:00
一文带你吃透什么是PHP中的序列化
2023-06-12 19:44:20
ASP XML编程objXML.async = False
2011-04-21 10:55:00
数学公式“四又二分之一”
2009-01-14 20:03:00
python数据分析之线性回归选择基金
2022-03-09 08:13:59
asp #include file 与 #include virtual 的区别小结第1/2页
2011-04-02 11:17:00
浅谈PHP的反射机制
2023-06-13 17:05:35
sqlserver关于分页存储过程的优化【让数据库按我们的意思执行查询计划】
2011-09-30 11:09:37
js表单验证控制代码大全
2010-03-07 14:25:00
20个优秀网站助你征服CSS[译]
2008-09-21 13:21:00
PHP编程入门的基本语法知识点总结
2023-06-14 11:16:36
Python实现自动化发送邮件
2023-12-07 14:39:58
深入php var_dump()函数的详解
2023-11-08 16:09:01
asp 使用正则表达式替换word中的标签,转为纯文本
2011-02-28 10:49:00
思考如何提高交互设计水平?
2009-12-08 12:18:00
oracle 触发器 学习笔记
2009-05-24 19:57:00
利用PHP自动生成印有用户信息的名片
2023-09-10 22:30:56