pythonUDP发送结构体,对齐到C++结构体
给出程序先:
import random
import socket
import struct
import threading
import pickle
import json
from struct import *
from time import sleep class sendMsg:
def __init__(self):
self.sendType=b'\x01'#ready
self.cliType=b'\x01'
self.lonDir=b'E'
self.latDir=b'N'
self.cliNum=1
self.lonDeg=100
self.lonMin=100
self.lonSec=100
self.latDeg=100
self.latMin=100
self.latSec=100
self.year=2019
self.month=9
self.day=6
self.hour=12
self.minute=10
self.second=10
self.ipFirst=192
self.ipSecond=168
self.ipThird=6
self.ipFourth=108
self.typeStr='cccciiiiiiiiiiiiiiiii' def __str__(self):
return self.cliNum
class RecMsg():
def __init__(self):
self.id=b'\x02'
self.ipFirst=192
self.ipSecond=168
self.ipThird=6
self.ipFourth=108
self.port=-1
self.errorType=b'\x01'
self.bandWidth=-1
self.typeStr='=ciiiiici' class CommunateThread(threading.Thread): # 继承父类threading.Thread
def __init__(self, id,packetLoss,socket,localIP,localPort,remoteIP,remotePort,file):
threading.Thread.__init__(self)
self.id=id
self.packetLoss=packetLoss
self.socket=socket
self.localIP = localIP
self.localPort=localPort
self.remoteIP = remoteIP
self.remotePort=remotePort
self.file=file
def run(self): # 把要执行的代码写到run函数里面 线程在创建后会直接运行run函数
connect=False
while True:
if not connect:
self.sendConnect()
data, addr = self.socket.recvfrom(1024)
print("接收到{}发送的消息{}".format(addr,data))
recMes = RecMsg()
recData = struct.unpack(recMes.typeStr,data)
print(recData)
if recData[0]==b'\x01' or (recData[0]==b'\x03' and recData[6]==b'\x01'):
self.sendFile(recData)
def readFile(self):
with open(self.file,"rb") as f:
data = f.read(1024)
while data:
yield data
data=f.read(1024)
def sendFile(self,recData):
ip = "{}.{}.{}.{}".format(recData[1],recData[2],recData[3],recData[4])
port = recData[5]
try:
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
i =1
for data in self.readFile():
p = random.randint(1,100)
if p<self.packetLoss:
continue
s.sendto(data,(ip,port))
sleep(0.005)
i+=1
if i%1000:
print(i," : send to {}:{},1k".format(ip,port)) print("发送完成,总计发送 {} K".format(i))
except Exception as e:
print(e)
def sendConnect(self):
connect =sendMsg()
connect.cliNum=self.id
data=pack( connect.typeStr,
connect.sendType,
connect.cliType,
connect.lonDir,
connect.latDir,
connect.cliNum,
connect.lonDeg,
connect.lonMin,
connect.lonSec,
connect.latDeg,
connect.latMin,
connect.latSec,
connect.year,
connect.month,
connect.day,
connect.hour,
connect.minute,
connect.second,
connect.ipFirst,
connect.ipSecond,
connect.ipThird,
connect.ipFourth)
#data=pack('ccccb',connect.sendType,connect.cliType,connect.lonDir,connect.lonDir,connect.year)
print(data)
self.socket.sendto(data,(self.remoteIP,self.remotePort))
print("send to {}:{}\t\n{}".format(self.remoteIP,self.remotePort,connect.__str__()))
def print_time(threadName, delay, counter):
pass
急着把消息发出去,所以代码有点乱,也没有注释,嘻嘻。
我们知道python 使用UDP发送消息,只能发送byte出去。那么,如何和一个c++(c#)的结构体进行打包和解包呢?使用pack和unpack就可以了。
比如说我们的结构体是 这样的

它们分别是char 和int型的数据。我们这样把这个结构体(暂且认为是结构体吧)打包成字节流:

我这样打包,直接发送出去,字节数为 1(字符/char)*4 + 4(int) *17 = 32 位。用c++/c#接收,没有什么问题的。
但是接收的时候,出现无法对齐的问题。所以我们对接收的解包格式这样定义:

至于为什么加一个“=”,可以查阅python的文档,有详细的解释。
中文版:https://docs.python.org/zh-cn/3.6/library/struct.html
英文版:https://docs.python.org/3.6/library/struct.html
pythonUDP发送结构体,对齐到C++结构体的更多相关文章
- C语言基础--结构体对齐,位域,联合体
结构体对齐 1--结构体对齐的原因与意义 许多计算机系统对基本数据类型的可允许地址做出了一些限制,要求某种类型的对象的地址必须是某个值K(通常是2,4,8)的倍数,而这个k则被称为该数据类型的对齐模数 ...
- C语言结构体对齐
1.结构体变量中的元素如何访问? (1)数组中元素的访问方式:表面上有2种方式(数组下标方式和指针方式):实质上都是指针方式访问.(2)结构体变量中的元素访问方式:只有一种,用.或者->的方式来 ...
- 解析C语言结构体对齐(内存对齐问题)
C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...
- 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等
今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...
- C语言中结构体对齐问题
C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...
- 4-17疑难点 c语言之【结构体对齐】
今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...
- linux中结构体对齐【转】
转自:https://blog.csdn.net/suifengpiao_2011/article/details/47260085 linux中定义对齐字节 typedef struct sdk_ ...
- C 中结构体对齐
参考 百度百科内存对齐 对齐作用 可以使得以最少的次数将操作数加载到寄存器中,如果数据没有对齐,则当CPU以最小读取数据大小从内存读入数据时可能只取到了一部分数据,而对齐情况下可以一次读入. 对齐修改 ...
- 结构体对齐及#pragma详细解释
在linux下c语言结构体对齐: 1.自然对齐 struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float 等)的变量,也可以是一些复合数据类型(如array.s ...
- const与#define、结构体对齐、函数重载name mangling、new/delete 等
一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 声明方式:bool result; result ...
随机推荐
- 零基础Python教程-函数及模块的使用
函数 在学习本节内容之前,我们先来一起做道数学题. 已知:半径分别为0.1.0.2.0.3的三个圆,分别求这三个圆的面积. 很多读者可能要笑一下,这不是小学的数学问题吗? S = π * r * r ...
- 《ABCD组》第九次团队作业:Beta冲刺与验收准备
<ABCD组>第九次团队作业:Beta冲刺与验收准备 项目 内容 这个作业属于哪个课程 http://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 http ...
- 关于axios请求携带cookie以及封装
axios跨域携带cookie需要配置 axios跨域发送请求的时候默认不会带上cookie的 + withCredentials的情况下,后端要设置Access-Control-Allow-Orig ...
- python - django (request 获取 访问者的 IP)
使用 Django 获取访问者的 IP if request.META.get('HTTP_X_FORWARDED_FOR'): ip = request.META.get("HTTP_X_ ...
- 2019-2020-1 20199302《Linux内核原理与分析》第二周作业
一.实验记录 1.实验代码截屏 本次实验中遇到的一个小问题是: (1)在进行汇编语言编译时,命令行本应是"g/.s*/d ",因为做实验的时候还没有看视频,只是看了书,把" ...
- django 第四天模板渲染
今日内容 一.模板渲染 语法 {{ 变量 }} {% 逻辑 %} 1.变量 取列表中的第几个元素,用索引 <p>{{ namelist.2 }}</p> 取字典中的第几个元素用 ...
- Kubernetes 学习13 kubernetes pv pvc configmap 和secret
一.概述 1.我们在pvc申请的时候未必就有现成的pv能正好符合这个pvc在申请中指定的条件,毕竟上一次的成功是我们有意设定了有一些满足有一些不满足的前提下我们成功创建了一个pvc并且被pod绑定所使 ...
- nohup 后台执行
nohup 默认是当前用户执行的,当当前用户退出会导致执行进程异常. 所以正确的 nohup 是指定 /bin/bash 进行执行. nohup /bin/bash/ /opt/script/s.s ...
- Mujin Programming Challenge 2017题解
传送门 \(A\) 似乎并不难啊然而还是没想出来-- 首先我们发现对于一个数\(k\),它能第一个走到当且仅当对于每一个\(i<k\)满足\(x_i\geq 2i-1\),这样我们就可以把所有的 ...
- (26)打鸡儿教你Vue.js
weex框架的使用 1.weex开发入门 2.weex开发环境搭建 3.掌握部分weex组件模块 4.了解一些vue基本常见语法 5.制作一个接近原生应用体验的app weex介绍 安装开发环境 We ...