Python里disconnect UDP套接字的方法
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套接字流重定向实例汇总
将套接字流重定向到标准输入或输出流 #!/usr/bin/env python3 """ 测试socket-stream 重定向模式 """ import sys,os,time from multiprocessing import Process from socket import * def initListenerSocket(port=50008,host=''): """ 初始化在服务器模式下调用者用于
-
python socket网络编程步骤详解(socket套接字使用)
一.套接字套接字是为特定网络协议(例如TCP/IP,ICMP/IP,UDP/IP等)套件对上的网络应用程序提供者提供当前可移植标准的对象.它们允许程序接受并进行连接,如发送和接受数据.为了建立通信通道,网络通信的每个端点拥有一个套接字对象极为重要.套接字为BSD UNIX系统核心的一部分,而且他们也被许多其他类似UNIX的操作系统包括Linux所采纳.许多非BSD UNIX系统(如ms-dos,windows,os/2,mac os及大部分主机环境)都以库形式提供对套接字的支持.三种最流行的套接
-
python原始套接字编程示例分享
下面开始构造HTTP数据包, IP层和TCP层使用python的Impacket库,http内容自行填写. 复制代码 代码如下: #!/usr/bin/env python #-------------------------------------------------------------------------------# Name: raw_http.py# Purpose: construct a raw http get packet## Author:
-
Python中利用原始套接字进行网络编程的示例
在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送. 使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TCP的限制. 下面开始构造HTTP数据包, IP层和TCP层使用python的Impacket库,http内容自行填写. #!/usr/bin/env pyt
-
详解python3中socket套接字的编码问题解决
一.TCP 1.tcp服务器创建 #创建服务器 from socket import * from time import ctime #导入ctime HOST = '' #任意主机 PORT = 21567 #随机提供个端口号 BUFSIZ = 1024 # 缓冲区大小设置为1KB,可以根据网络性能和程序需要改变这个容量 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) #分配了 TCP 服务器套接字 tcpSerSo
-
Python网络编程 Python套接字编程
Python 提供了两个级别访问的网络服务. 低级别的网络服务支持基本的 Socket,它提供了标准的 BSD Sockets API,可以访问底层操作系统Socket接口的全部方法. 高级别的网络服务模块 SocketServer, 它提供了服务器中心类,可以简化网络服务器的开发. 什么是 Socket? Socket又称"套接字",应用程序通常通过"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. socket()函数 Pyth
-
Python里disconnect UDP套接字的方法
UDP 套接字是可以使用 connect 系统调用连接到指定的地址的.从此以后,这个套接字只会接收来自这个地址的数据,而且可以使用 send 系统调用直接发数据而不用指定地址.可以再次调用 connect 来连接到别的地方.但是在 Python 里,一旦调用 connect 之后,就再也回不到最初的能够接收从任意地址来的数据的状态了! 这是 Python 的 API 限制,没办法给 connect 方法传递到 AF_UNSPEC 地址簇(在 C 代码里写死了的).C 里边就可以做到的(代码来自这
-
python基础之Socket套接字详解
前言 Python语言提供了Socket套接字来实现网络通信. Python的应用程序通常通过Socket"套接字"向网络发出请求或者应答网络请求,使主机间或者一台计算机上的进程间可以通讯. 服务器和客户端的源代码 服务器端 #coding=utf-8 #创建TCP服务器 import socket import time from time import ctime HOST = '127.0.0.1' PORT = 8080 BUFSIZE=1024 sock = socket.s
-
python检测远程udp端口是否打开的方法
本文实例讲述了python检测远程udp端口是否打开的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: import socket import threading import time import struct import Queue queue = Queue.Queue() def udp_sender(ip,port): try: ADDR = (ip,port) sock_udp = socket.socket(sock
-
Python 网络编程之UDP发送接收数据功能示例【基于socket套接字】
本文实例讲述了Python 网络编程之UDP发送接收数据功能.分享给大家供大家参考,具体如下: demo.py(UDP发送数据): import socket # 导入socket模块 def main(): # 创建一个udp套接字 udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # 绑定本机ip和端口号 (发送数据时,如果不绑定,系统会随机分配端口号.接收数据时,一般需要手动绑定ip和端口) udp_socket.b
-
Python实现socket库网络通信套接字
Socket 套接字:通讯端点 简介 socket起源于Unix,而Unix/Linux基本哲学之一就是"一切皆文件",对于文件用[打开][读写][关闭]模式来操作.socket就是该模式的一个实现,socket即是一种特殊的文件,一些socket函数就是对其进行的操作(读/写IO.打开.关闭). Socket 是任何一种计算机网络通讯中最基础的内容.Socket通讯一般用户C/S结构系统的网络通讯. Socket 网络通讯是基于TCP(传输控制协议)或UDP(用户数据报协议)两种协议
-
Python网络编程之TCP与UDP协议套接字用法示例
本文实例讲述了Python网络编程之TCP与UDP协议套接字用法.分享给大家供大家参考,具体如下: TCP协议 服务器端: #!/usr/bin/env python from socket import * from time import ctime HOST = '' PORT = 21567 BUFSIZ = 1024 ADDR = (HOST, PORT) tcpSerSock = socket(AF_INET, SOCK_STREAM) ##创建服务器TCP套接字 tcpSerSoc
-
Python原始套接字编程实例解析
这篇文章主要介绍了Python原始套接字编程实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在实验中需要自己构造单独的HTTP数据报文,而使用SOCK_STREAM进行发送数据包,需要进行完整的TCP交互. 因此想使用原始套接字进行编程,直接构造数据包,并在IP层进行发送,即采用SOCK_RAW进行数据发送. 使用SOCK_RAW的优势是,可以对数据包进行完整的修改,可以处理IP层上的所有数据包,对各字段进行修改,而不受UDP和TCP的
-
python 基于UDP协议套接字通信的实现
一.UPD实现单用户通信 服务端: ''' from socket import * server=socket(AF_INET,SOCK_DGRAM) - 这里代指的是一种数据报协议,数据报协议指的就是udp协议(补充: 数据报就是自己utp协议中有自己的头,有自己的数据部分) server.bind('IP', PORT) bytes类型的数据, client_addr = server.recvfrom(1024) - client_addr是一个2元组的形式: 第一个参数是客户端的IP地
随机推荐
- 如何利用Ruby简单模拟Lambda演算详解
- 特殊的存储过程-触发器概述
- 前端主流框架vue学习笔记第一篇
- 学习正则表达式30分钟入门教程(第二版)
- php字符串分割函数explode的实例代码
- iOS开发实现音频播放功能
- ASP.NET MVC Web API HttpClient简介
- Python随手笔记第一篇(2)之初识列表和元组
- 让 python 命令行也可以自动补全
- 常用的js方法合集
- Lua性能优化技巧(一):前言
- 不比熊猫弱的可以穿透冰点5.7--6.2机器狗病毒解决办法与机器狗病毒的官方防御方法第1/2页
- JQuery实现可编辑的表格实例讲解(2)
- Java总结篇系列:Java泛型详解
- Apache httpd 安装module mod_expires、mod_deflate的方法
- 不允许错过的Anndroid技术经验60条
- C++实现多线程查找文件实例
- 基于angular-utils-ui-breadcrumbs使用心得(分享)
- Python中常用信号signal类型实例
- vue+element-ui+axios实现图片上传