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中每次处理一个字符的5种方法
May 21 Python
Windows上使用Python增加或删除权限的方法
Apr 24 Python
flask中的wtforms使用方法
Jul 21 Python
对pandas的层次索引与取值的新方法详解
Nov 06 Python
Pycharm取消py脚本中SQL识别的方法
Nov 29 Python
python3.6中@property装饰器的使用方法示例
Aug 17 Python
python实现对列表中的元素进行倒序打印
Nov 23 Python
Python类反射机制使用实例解析
Dec 30 Python
Windows10+anacond+GPU+pytorch安装详细过程
Mar 24 Python
pytorch快速搭建神经网络_Sequential操作
Jun 17 Python
keras训练浅层卷积网络并保存和加载模型实例
Jul 02 Python
如何利用python实现Simhash算法
Jun 28 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
用Zend Encode编写开发PHP程序
2010/02/21 PHP
PHP 写文本日志实现代码
2010/05/18 PHP
javascript中的onkeyup和onkeydown区别介绍
2013/04/28 Javascript
页面右下角弹出提示框示例代码js版
2013/08/02 Javascript
使用CSS样式position:fixed水平滚动的方法
2014/02/19 Javascript
JavaScript运算符小结
2015/06/03 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
Nodejs获取网络数据并生成Excel表格
2020/03/31 NodeJs
JavaScript自定义文本框光标
2017/03/05 Javascript
JS简单实现数组去重的方法示例
2017/03/27 Javascript
VueJS 集成 Medium Editor的示例代码 (自定义编辑器按钮)
2017/08/24 Javascript
vue+高德地图写地图选址组件的方法
2019/05/18 Javascript
[08:54]《一刀刀一天》之DOTA全时刻18:十九支奔赴西雅图队伍全部出炉
2014/06/04 DOTA
[01:31:22]Ti4 循环赛第四日附加赛LGD vs Mouz
2014/07/13 DOTA
import的本质解析
2017/10/30 Python
Python实现的购物车功能示例
2018/02/11 Python
python构建深度神经网络(DNN)
2018/03/10 Python
Python实现图片拼接的代码
2018/07/02 Python
Python使用pandas对数据进行差分运算的方法
2018/12/22 Python
python  文件的基本操作 菜中菜功能的实例代码
2019/07/17 Python
opencv3/C++图像像素操作详解
2019/12/10 Python
python中的对数log函数表示及用法
2020/12/09 Python
Python中的流程控制详解
2021/02/18 Python
SmartBuyGlasses德国:购买太阳镜和眼镜
2019/08/20 全球购物
C++:局部变量能否和全局变量重名
2014/03/03 面试题
EJB与JAVA BEAN的区别
2016/08/29 面试题
教师求职推荐信范文
2013/11/20 职场文书
文言文形式的学生求职信
2013/12/03 职场文书
防火标语大全
2014/10/06 职场文书
教师工作态度自我评价
2015/03/05 职场文书
医院办公室主任岗位职责
2015/04/01 职场文书
总结几个非常实用的Python库
2021/06/26 Python
mysql备份策略的实现(全量备份+增量备份)
2021/07/07 MySQL
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js
python实现双向链表原理
2022/05/25 Python