给出程序先:

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++结构体的更多相关文章

  1. C语言基础--结构体对齐,位域,联合体

    结构体对齐 1--结构体对齐的原因与意义 许多计算机系统对基本数据类型的可允许地址做出了一些限制,要求某种类型的对象的地址必须是某个值K(通常是2,4,8)的倍数,而这个k则被称为该数据类型的对齐模数 ...

  2. C语言结构体对齐

    1.结构体变量中的元素如何访问? (1)数组中元素的访问方式:表面上有2种方式(数组下标方式和指针方式):实质上都是指针方式访问.(2)结构体变量中的元素访问方式:只有一种,用.或者->的方式来 ...

  3. 解析C语言结构体对齐(内存对齐问题)

    C语言结构体对齐也是老生常谈的话题了.基本上是面试题的必考题.内容虽然很基础,但一不小心就会弄错.写出一个struct,然后sizeof,你会不会经常对结果感到奇怪?sizeof的结果往往都比你声明的 ...

  4. 函数定义从零开始学C++之从C到C++(一):const与#define、结构体对齐、函数重载name mangling、new/delete 等

    今天一直在学习函数定义之类的问题,下午正好有机会和大家共享一下. 一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC+ ...

  5. C语言中结构体对齐问题

    C语言中结构体对齐问题 收藏 关于C语言中的结构体对齐问题 1,比如: struct{short a1;short a2;short a3;}A;struct{long a1;short a2;}B; ...

  6. 4-17疑难点 c语言之【结构体对齐】

    今天学习了结构体这一章节,了解到了结构体在分配内存的时候采取的是对齐的方式 例如: #include<stdio.h> struct test1 { int a; char b; shor ...

  7. linux中结构体对齐【转】

    转自:https://blog.csdn.net/suifengpiao_2011/article/details/47260085 linux中定义对齐字节 typedef struct  sdk_ ...

  8. C 中结构体对齐

    参考 百度百科内存对齐 对齐作用 可以使得以最少的次数将操作数加载到寄存器中,如果数据没有对齐,则当CPU以最小读取数据大小从内存读入数据时可能只取到了一部分数据,而对齐情况下可以一次读入. 对齐修改 ...

  9. 结构体对齐及#pragma详细解释

    在linux下c语言结构体对齐: 1.自然对齐 struct 是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.float 等)的变量,也可以是一些复合数据类型(如array.s ...

  10. const与#define、结构体对齐、函数重载name mangling、new/delete 等

    一.bool 类型 逻辑型也称布尔型,其取值为true(逻辑真)和false(逻辑假),存储字节数在不同编译系统中可能有所不同,VC++中为1个字节. 声明方式:bool result; result ...

随机推荐

  1. 题解 洛谷P2258 【子矩阵】

    应该很容易想到暴力骗分. 我们考虑暴力\(dfs\)枚举所有行的选择,列的选择,每次跑一遍记下分值即可. 时间复杂度:\(O(C_n^r \times C_m^c \times r \times c) ...

  2. Python爬取微信公众号素材库

    这是我的之前写的代码,今天发布到博客园上,说不定以后需要用. 开始: #coding:utf-8 import werobot import pymongo   class Gongzhonghao( ...

  3. 三大框架整合模板ssh

    1.web.xml配置 <!-- 让spring随web启动而创建的监听器 --> <listener> <listener-class>org.springfra ...

  4. 虚拟机安装Linux从零到登陆成功教学

    1.Linux Linux使我们出来windows以外可能接触最多的操作系统了,因为好多超级大的互联网公司,比如阿里等就是用Linux的,所以我们最起码要知道怎样去使用,使用的前提就是我们要有一个这样 ...

  5. 十五.ProtoBuf3的基础总结

    转自: https://blog.csdn.net/u011518120/article/details/54604615 定义一个消息类型 指定字段类型 分配标识号 指定字段规则 添加更多消息类型 ...

  6. PHP 开发者常犯的 10 个 MySQL 错误

    数据库是WEB大多数应用开发的基础.如果你是用PHP,那么大多数据库用的是MYSQL也是LAMP架构的重要部分. PHP看起来很简单,一个初学者也可以几个小时内就能开始写函数了.但是建立一个稳定.可靠 ...

  7. 关于redis的持久化策略

    Redis的持久化 Redis虽然是基于内存的存储系统,但是它本身是支持内存数据的持久化的,而且提供两种主要的持久化策略:RDB快照和AOF日志. Redis的RDB快照 Redis支持将当前数据的快 ...

  8. go语言-流程控制--if

    一.基本语法介绍 表达式后一定要带{},表达式不需要带(),在if中支持直接定义一个变量,如a:=2 if 表达式{ 代码执行块 }else if{ 代码执行块 }else{ 代码执行块 } 案例1. ...

  9. js正则验证input输入框有空格时提示直接去除空格

    <input type="text" id="test"/> <input type="button" value=&qu ...

  10. H3CNE学习6 静态路由

    一.相应命令 1.查看路由表 2.直连路由 3.静态路由配置 4.路由器转发数据包 二.静态路由2 1.路由优先级 管理距离即优先级,值越小就越优先 2.路由度量 如果上下都是使用的相同的路由协议那么 ...