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 Mysql数据库操作 Perl操作Mysql数据库
Jan 12 Python
分析python服务器拒绝服务攻击代码
Jan 16 Python
Python collections模块实例讲解
Apr 07 Python
python实现根据主机名字获得所有ip地址的方法
Jun 28 Python
Python 探针的实现原理
Apr 23 Python
Python之re操作方法(详解)
Jun 14 Python
python通过配置文件共享全局变量的实例
Jan 11 Python
学习Django知识点分享
Sep 11 Python
python中for循环变量作用域及用法详解
Nov 05 Python
Python GUI编程学习笔记之tkinter中messagebox、filedialog控件用法详解
Mar 30 Python
Scrapy-Redis之RedisSpider与RedisCrawlSpider详解
Nov 18 Python
Python进度条的使用
May 17 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 str_pad 函数使用详解
2009/01/13 PHP
php 验证码制作(网树注释思想)
2009/07/20 PHP
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
YII中assets的使用示例
2014/07/31 PHP
thinkphp3.x自定义Action、Model及View的简单实现方法
2016/05/19 PHP
针对多用户实现头像上传功能PHP代码 适用于登陆页面制作
2016/08/17 PHP
PHP Include文件实例讲解
2019/02/15 PHP
discuz论坛更换域名,详细文件修改步骤
2020/12/09 PHP
Javascript 继承机制实例
2009/08/12 Javascript
面向对象的javascript(笔记)
2009/10/06 Javascript
JavaScript制作简易的微信打飞机
2015/03/31 Javascript
整理JavaScript创建对象的八种方法
2015/11/03 Javascript
Yarn的安装与使用详细介绍
2016/10/25 Javascript
JS瀑布流实现方法实例分析
2016/12/19 Javascript
Vue.js -- 过滤器使用总结
2017/02/18 Javascript
JS中的多态实例详解
2017/10/15 Javascript
JS 实现缓存算法的示例(FIFO/LRU)
2018/03/20 Javascript
node中modules.exports与exports导出的区别
2018/06/08 Javascript
vue element upload实现图片本地预览
2019/08/20 Javascript
vue组件讲解(is属性的用法)模板标签替换操作
2020/09/04 Javascript
使用Python实现租车计费系统的两种方法
2018/09/29 Python
python3 实现验证码图片切割的方法
2018/12/07 Python
一些关于python 装饰器的个人理解
2020/08/31 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
Room Mate Hotels美国:西班牙酒店品牌
2018/04/10 全球购物
飞利浦法国官网:Philips法国
2019/07/10 全球购物
如何将整数int转换成字串String
2014/03/21 面试题
Linux文件操作命令都有哪些
2016/07/23 面试题
房地产资料员岗位职责
2014/07/02 职场文书
2015自愿离婚协议书范本
2015/01/28 职场文书
山楂树之恋观后感
2015/06/11 职场文书
圣诞晚会主持词
2015/07/01 职场文书
pytorch 6 batch_train 批训练操作
2021/05/28 Python
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP
Python中使用ipython的详细教程
2021/06/22 Python
纯CSS3实现div按照顺序出入效果
2021/07/15 HTML / CSS