Python里disconnect UDP套接字的方法


Posted in Python onApril 23, 2015

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 相关文章推荐
Python中的pprint折腾记
Jan 21 Python
python函数形参用法实例分析
Aug 04 Python
python3中的md5加密实例
May 29 Python
pygame游戏之旅 游戏中添加显示文字
Nov 20 Python
python如何查看微信消息撤回
Nov 27 Python
对pytorch网络层结构的数组化详解
Dec 08 Python
Django框架模型简单介绍与使用分析
Jul 18 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
Dec 26 Python
Windows 下python3.8环境安装教程图文详解
Mar 11 Python
解决python虚拟环境切换无效的问题
Apr 30 Python
Python爬取科目四考试题库的方法实现
Mar 30 Python
Python中np.random.randint()参数详解及用法实例
Sep 23 Python
Python实现的Google IP 可用性检测脚本
Apr 23 #Python
Python3.2中的字符串函数学习总结
Apr 23 #Python
Python与Redis的连接教程
Apr 22 #Python
Python实现的数据结构与算法之快速排序详解
Apr 22 #Python
利用Fn.py库在Python中进行函数式编程
Apr 22 #Python
Python实现的数据结构与算法之基本搜索详解
Apr 22 #Python
Python实现的数据结构与算法之链表详解
Apr 22 #Python
You might like
怎样在UNIX系统下安装MySQL
2006/10/09 PHP
php利用反射实现插件机制的方法
2015/03/14 PHP
PHP创建文件,并向文件中写入数据,覆盖,追加的实现代码
2016/03/25 PHP
抽出www.templatemonster.com的鼠标悬停加载大图模板的代码
2007/07/11 Javascript
javascript getElementsByClassName实现代码
2010/10/11 Javascript
Jquery实现鼠标移上弹出提示框、移出消失思路及代码
2013/05/19 Javascript
顶部缓冲下拉菜单导航特效的JS代码
2013/08/27 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
jQuery实现的简单分页示例
2016/06/01 Javascript
微信小程序 实现tabs选项卡效果实例代码
2016/10/31 Javascript
js实现交通灯效果
2017/01/13 Javascript
使用原生js封装的ajax实例(兼容jsonp)
2017/10/12 Javascript
JS实现小球的弹性碰撞效果
2017/11/11 Javascript
仿vue-cli搭建属于自己的脚手架的方法步骤
2019/04/17 Javascript
Vue对象赋值视图不更新问题及解决方法
2019/06/03 Javascript
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
ES6中new Function()语法及应用实例分析
2020/02/19 Javascript
python爬虫实战之最简单的网页爬虫教程
2017/08/13 Python
Php多进程实现代码
2018/05/07 Python
Python运维开发之psutil库的使用详解
2018/10/18 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
python3正则提取字符串里的中文实例
2019/01/31 Python
Python静态类型检查新工具之pyright 使用指南
2019/04/26 Python
在自动化中用python实现键盘操作的方法详解
2019/07/19 Python
详解用python生成随机数的几种方法
2019/08/04 Python
使用OpenCV实现道路车辆计数的使用方法
2020/07/15 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
美国健康和保健平台:healtop
2020/07/02 全球购物
通用C#笔试题附答案
2016/11/26 面试题
新闻专业学生的自我评价
2014/02/13 职场文书
村创先争优活动总结
2014/08/28 职场文书
2014年教师节演讲稿
2014/09/03 职场文书
幼儿教师师德师风自我剖析材料
2014/09/29 职场文书
机关单位2016年法制宣传日活动总结
2016/04/01 职场文书
JS实现扫雷项目总结
2021/05/19 Javascript