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 with statement 进行文件操作指南
Aug 22 Python
分享Python字符串关键点
Dec 13 Python
利用Python查看目录中的文件示例详解
Aug 28 Python
Python利用itchat对微信中好友数据实现简单分析的方法
Nov 21 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
Nov 23 Python
Python对列表去重的多种方法(四种方法)
Dec 05 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 Python
python操作redis方法总结
Jun 06 Python
Centos下实现安装Python3.6和Python2共存
Aug 15 Python
python yield关键词案例测试
Oct 15 Python
numpy ndarray 取出满足特定条件的某些行实例
Dec 05 Python
Python lambda表达式原理及用法解析
Aug 18 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文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
joomla jce editor 解决上传中文名文件失败问题
2013/06/09 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
JQuery Ajax 跨域访问的解决方案
2010/03/12 Javascript
javascript自执行函数之伪命名空间封装法
2010/12/25 Javascript
IE6、IE7中setAttribute不支持class/for/rowspan/colspan等属性
2011/08/28 Javascript
一个简单的jQuery插件ajaxfileupload.js实现ajax上传文件例子
2014/06/26 Javascript
JS弹出层遮罩,隐藏背景页面滚动条细节优化分析
2016/04/29 Javascript
限制复选框最多选择项的实现代码
2016/05/30 Javascript
图解prototype、proto和constructor的三角关系
2016/07/31 Javascript
angularjs 源码解析之injector
2016/08/22 Javascript
js关于getImageData跨域问题的解决方法
2016/10/14 Javascript
关于Node.js中Buffer的一些你可能不知道的用法
2017/03/28 Javascript
vue使用axios跨域请求数据问题详解
2017/10/18 Javascript
Vue2.0用户权限控制解决方案的示例
2018/02/10 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
详解适配器在JavaScript中的体现
2018/09/28 Javascript
使用gulp构建前端自动化的方法示例
2018/12/25 Javascript
Vue.js组件使用props传递数据的方法
2019/10/19 Javascript
解决vue scoped html样式无效的问题
2020/10/24 Javascript
如何使用gpu.js改善JavaScript的性能
2020/12/01 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
python每隔N秒运行指定函数的方法
2015/03/16 Python
Python简单实现自动删除目录下空文件夹的方法
2017/08/29 Python
详解python实现线程安全的单例模式
2018/03/05 Python
使用Python AIML搭建聊天机器人的方法示例
2018/07/09 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
python如何判断IP地址合法性
2020/04/05 Python
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
CSS3制作皮卡丘动画壁纸的示例
2020/11/02 HTML / CSS
欧铁通票官方在线销售网站:Eurail.com
2017/10/14 全球购物
西班牙高科技产品购物网站:MejorDeseo
2019/09/08 全球购物
信息服务专业毕业生求职信
2014/03/02 职场文书
医学专业自荐信
2014/06/14 职场文书
倡议书的写法
2014/08/30 职场文书
MIME类型中application/xml与text/xml的区别介绍
2022/01/18 HTML / CSS