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
  • asp之家 网络编程 m.aspxhome.com