源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

Python里disconnect UDP套接字的方法

  • 时间:2020-08-25 01:22 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:Python里disconnect UDP套接字的方法
UDP 套接字是可以使用 connect 系统调用连接到指定的地址的。从此以后,这个套接字只会接收来自这个地址的数据,而且可以使用 send 系统调用直接发数据而不用指定地址。可以再次调用 connect 来连接到别的地方。但是在 Python 里,一旦调用 connect 之后,就再也回不到最初的能够接收从任意地址来的数据的状态了! 这是 Python 的 API 限制,没办法给 connect 方法传递到 AF_UNSPEC 地址簇(在 C 代码里写死了的)。C 里边就可以做到的([url=http://timesinker.blogspot.com/2010/02/unconnect-udp-socket.html]代码来自这里[/url]):
[u]复制代码[/u] 代码如下:
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 就可以绕过了嘛,有些麻烦就是了:
[u]复制代码[/u] 代码如下:
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 就可以了 :-)
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部