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目录与文件名操作例子
Aug 28 Python
python 实现自动远程登陆scp文件实例代码
Mar 13 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
Jan 11 Python
python关于矩阵重复赋值覆盖问题的解决方法
Jul 19 Python
对python中的os.getpid()和os.fork()函数详解
Aug 08 Python
关于pandas的离散化,面元划分详解
Nov 22 Python
python 遗传算法求函数极值的实现代码
Feb 11 Python
Python实现分数序列求和
Feb 25 Python
python GUI库图形界面开发之PyQt5 UI主线程与耗时线程分离详细方法实例
Feb 26 Python
Python实现在Windows平台修改文件属性
Mar 05 Python
Python3.7安装pyaudio教程解析
Jul 24 Python
Python定时任务APScheduler安装及使用解析
Aug 07 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
《猛禽小队》:DC宇宙的又一超级大烂片
2020/04/09 欧美动漫
php include加载文件两种方式效率比较
2010/08/08 PHP
PH P5.2至5.5、5.6的新增功能详解
2014/07/14 PHP
通过修改Laravel Auth使用salt和password进行认证用户详解
2017/08/17 PHP
PHP 使用位运算实现四则运算的代码
2021/03/09 PHP
基于jquery的15款幻灯片插件
2011/04/10 Javascript
js处理json以及字符串的比较等常用操作
2013/09/08 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
JavaScript+html5 canvas绘制缤纷多彩的三角形效果完整实例
2016/01/26 Javascript
vue.js初学入门教程(1)
2016/11/03 Javascript
jQuery编写textarea输入字数限制代码
2017/03/23 jQuery
Vue和Bootstrap的整合思路详解
2017/06/30 Javascript
vue2单元测试环境搭建
2018/05/24 Javascript
react在安卓中输入框被手机键盘遮挡问题的解决方法
2018/09/03 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
详解Vue-cli3.X使用px2rem遇到的问题
2019/08/09 Javascript
Vue3 源码导读(推荐)
2019/10/14 Javascript
javascript利用canvas实现鼠标拖拽功能
2020/07/23 Javascript
Python标准库之Sys模块使用详解
2015/05/23 Python
Python获取央视节目单的实现代码
2015/07/25 Python
python3抓取中文网页的方法
2015/07/28 Python
Python多线程爬虫实战_爬取糗事百科段子的实例
2017/12/15 Python
利用python对Excel中的特定数据提取并写入新表的方法
2018/06/14 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
Python txt文件如何转换成字典
2020/11/03 Python
您的健身减肥和健康饮食专家:vitafy
2017/06/06 全球购物
印度第一网上礼品店:IGP.com
2020/02/06 全球购物
30年同学聚会感言
2014/01/30 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
专项法律服务方案
2014/06/11 职场文书
关于应聘教师的自荐信
2016/01/28 职场文书
导游词之青岛崂山
2019/12/27 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
mysql5.7使用binlog 恢复数据的方法
2021/06/03 MySQL
分享一个vue实现的记事本功能案例
2022/04/11 Vue.js
Redis官方可视化工具RedisInsight安装使用教程
2022/04/19 Redis