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程序
Apr 04 Python
Python中实现常量(Const)功能
Jan 28 Python
Python使用win32com实现的模拟浏览器功能示例
Jul 13 Python
python中从str中提取元素到list以及将list转换为str的方法
Jun 26 Python
python实现根据指定字符截取对应的行的内容方法
Oct 23 Python
浅谈python的dataframe与series的创建方法
Nov 12 Python
Python语言快速上手学习方法
Dec 14 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
django执行数据库查询之后实现返回的结果集转json
Mar 31 Python
简单了解Java Netty Reactor三种线程模型
Apr 26 Python
基于Pyinstaller打包Python程序并压缩文件大小
May 28 Python
python 实现逻辑回归
Dec 30 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.ini不生效问题解决方法(上传大于8M的文件)
2013/06/14 PHP
php面向对象中static静态属性和静态方法的调用
2015/02/08 PHP
PHP Oauth授权和本地加密实现方法
2016/08/12 PHP
Add a Table to a Word Document
2007/06/15 Javascript
对JavaScript的eval()中使用函数的进一步讨论
2008/07/26 Javascript
Javascript 作用域使用说明
2009/08/13 Javascript
Mootools 图片展示插件(lightbox,ImageMenu)收集集合
2010/05/21 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
在图片上显示左右箭头类似翻页的代码
2013/03/04 Javascript
jquery的ajax请求全面了解
2013/03/20 Javascript
原生js实现跨浏览器获取鼠标按键的值
2013/04/08 Javascript
js replace 与replaceall实例用法详解
2013/08/03 Javascript
js实现的点击数量加一可操作数据库
2014/05/09 Javascript
IE8下jQuery改变png图片透明度时出现的黑边
2015/08/30 Javascript
JS实现黑客帝国文字下落效果
2015/09/01 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
node.js利用socket.io实现多人在线匹配联机五子棋
2018/05/31 Javascript
小程序实现带年月选取效果的日历
2018/06/27 Javascript
详解javascript设计模式三:代理模式
2019/03/25 Javascript
echarts实现折线图的拖拽效果
2019/12/19 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
python备份文件以及mysql数据库的脚本代码
2013/06/10 Python
sqlalchemy对象转dict的示例
2014/04/22 Python
使用python编写android截屏脚本双击运行即可
2014/07/21 Python
浅谈Scrapy网络爬虫框架的工作原理和数据采集
2019/02/07 Python
python判断所输入的任意一个正整数是否为素数的两种方法
2019/06/27 Python
迪卡侬(Decathlon)加拿大官网:源自法国的运动专业超市
2020/11/22 全球购物
main 主函数执行完毕后,是否可能会再执行一段代码,给出说明
2012/12/05 面试题
大学生文员专业个人求职信范文
2014/01/05 职场文书
便利店的创业计划书
2014/01/15 职场文书
施工安全标语
2014/06/07 职场文书
幼儿园端午节活动方案
2014/08/25 职场文书
详解使用 CSS prefers-* 规范提升网站的可访问性与健壮性
2021/05/25 HTML / CSS
python pygame入门教程
2021/06/01 Python
解决mysql问题:由于找不到MSVCR120.dll,无法继续执行代码
2021/06/26 MySQL