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获取系统默认字符编码的方法
Jun 04 Python
Python 基于Twisted框架的文件夹网络传输源码
Aug 28 Python
Python常见格式化字符串方法小结【百分号与format方法】
Sep 18 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
Python BS4库的安装与使用详解
Aug 08 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
深入理解Python异常处理的哲学
Feb 01 Python
Python OOP类中的几种函数或方法总结
Feb 22 Python
Python利用lxml模块爬取豆瓣读书排行榜的方法与分析
Apr 15 Python
python字典的遍历3种方法详解
Aug 10 Python
opencv3/C++图像像素操作详解
Dec 10 Python
python实现AdaBoost算法的示例
Oct 03 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
PHP中的替代语法介绍
2015/01/09 PHP
简单介绍PHP非阻塞模式
2016/03/03 PHP
Zend Framework教程之路由功能Zend_Controller_Router详解
2016/03/07 PHP
解决laravel-admin 自己新建页面里 js 需要刷新一次的问题
2019/10/03 PHP
javascript一个无懈可击的实例化XMLHttpRequest的方法
2010/10/13 Javascript
JavaScript性能陷阱小结(附实例说明)
2010/12/28 Javascript
jquery数组过滤筛选方法grep()简介
2014/06/06 Javascript
jQuery移除tr无效的解决方法(tr是动态添加)
2014/09/22 Javascript
动态更新highcharts数据的实现方法
2016/05/28 Javascript
AngularJS解决ng界面长表达式(ui-set)的方法分析
2016/11/07 Javascript
JS实现下拉菜单列表与登录注册弹窗效果
2017/08/10 Javascript
JS基于for语句编写的九九乘法表示例
2018/01/04 Javascript
Vue 2.5.2下axios + express 本地请求404的解决方法
2018/02/21 Javascript
使用typescript开发angular模块并发布npm包
2018/04/19 Javascript
vue-cli2打包前和打包后的css前缀不一致的问题解决
2018/08/24 Javascript
React精髓!一篇全概括小结(急速)
2019/05/23 Javascript
微信小程序发布新版本时自动提示用户更新的方法
2019/06/07 Javascript
python实现将内容分行输出
2015/11/05 Python
python方法生成txt标签文件的实例代码
2018/05/10 Python
tensorflow 用矩阵运算替换for循环 用tf.tile而不写for的方法
2018/07/27 Python
浅谈python脚本设置运行参数的方法
2018/12/03 Python
Python多项式回归的实现方法
2019/03/11 Python
关于python pycharm中输出的内容不全的解决办法
2020/01/10 Python
解决Django提交表单报错:CSRF token missing or incorrect的问题
2020/03/13 Python
浅谈tensorflow模型保存为pb的各种姿势
2020/05/25 Python
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
附答案的Java面试题
2012/11/19 面试题
下列程序在32位linux或unix中的结果是什么
2014/03/25 面试题
经销商培训邀请函
2014/01/21 职场文书
阳光体育活动总结
2014/04/30 职场文书
教育专业毕业生推荐信
2014/07/10 职场文书
防火标语大全
2014/10/06 职场文书
父亲节活动总结
2015/02/12 职场文书
销售业务员岗位职责
2015/02/13 职场文书
小学教师师德师风承诺书
2015/04/28 职场文书
阿里云服务器(windows)手动部署FTP站点详细教程
2022/08/05 Servers