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的Tornado框架中实现简单的在线代理的教程
May 02 Python
浅谈Python中的数据类型
May 05 Python
Python找出list中最常出现元素的方法
Jun 14 Python
Python读写Json涉及到中文的处理方法
Sep 12 Python
解决新django中的path不能使用正则表达式的问题
Dec 18 Python
pytorch 模型可视化的例子
Aug 17 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
python自动下载图片的方法示例
Mar 25 Python
Python ArgumentParse的subparser用法说明
Apr 20 Python
python代码区分大小写吗
Jun 17 Python
Python Tornado核心及相关原理详解
Jun 24 Python
Python pysnmp使用方法及代码实例
Aug 24 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实现parent调用父类的构造方法与被覆写的方法
2015/02/11 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
PHP ADODB实现事务处理功能示例
2018/05/25 PHP
利用javascript实现一些常用软件的下载导航
2009/08/03 Javascript
JavaScript下利用fso判断文件是否存在的代码
2010/12/11 Javascript
jquery validate添加自定义验证规则(验证邮箱 邮政编码)
2013/12/04 Javascript
一个网页标题title的闪动提示效果实现思路
2014/03/22 Javascript
jquery拖拽效果完整实例(附demo源码下载)
2016/01/14 Javascript
深入理解setTimeout函数和setInterval函数
2016/05/20 Javascript
javascript 数组的正态分布排序的问题
2016/07/31 Javascript
详解用webpack2.0构建vue2.0超详细精简版
2017/04/05 Javascript
JS设计模式之状态模式概念与用法分析
2018/02/05 Javascript
Less 安装及基本用法
2018/05/05 Javascript
详解Vue 多级组件透传新方法provide/inject
2018/05/09 Javascript
AngularJS日期格式化常见操作实例分析
2018/05/17 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
JS加密插件CryptoJS实现的Base64加密示例
2020/08/16 Javascript
配置eslint规范项目代码风格
2019/03/11 Javascript
详解利用eventemitter2实现Vue组件通信
2019/11/04 Javascript
js 动态校验开始结束时间的实现代码
2020/05/25 Javascript
解决vue 给window添加和移除resize事件遇到的坑
2020/07/21 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
[35:43]2018DOTA2亚洲邀请赛 4.1 小组赛B组 paiN vs Effect
2018/04/03 DOTA
Python3实现简单可学习的手写体识别(实例讲解)
2017/10/21 Python
Python实现重建二叉树的三种方法详解
2018/06/23 Python
numpy给array增加维度np.newaxis的实例
2018/11/01 Python
基于python实现自动化办公学习笔记(CSV、word、Excel、PPT)
2019/08/06 Python
python 实现提取log文件中的关键句子,并进行统计分析
2019/12/24 Python
Pytorch 使用CNN图像分类的实现
2020/06/16 Python
使用npy转image图像并保存的实例
2020/07/01 Python
python 基于opencv去除图片阴影
2021/01/26 Python
用CSS禁用输入法(CSS3 UI规范)实例解析
2012/12/04 HTML / CSS
办公室驾驶员岗位职责
2013/11/15 职场文书
应用数学自荐书范文
2013/11/24 职场文书
爱牙日活动总结
2014/08/29 职场文书
学校元旦晚会开场白
2015/05/29 职场文书