给出程序先:

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. 用js刷剑指offer(两个链表的第一个公共结点)

    题目描述 输入两个链表,找出它们的第一个公共结点. 牛客网链接 js代码 /*function ListNode(x){ this.val = x; this.next = null; }*/ fun ...

  2. linux系统编程之信号(三)

    今天继续对信号进行研究,话不多说,言归正传: 更多信号发送函数: 上节中我们已经接触到了一些信号的发送函数,这里更进一步学习一下其它的发送函数: alarm:只能发送SIGALRM信号 下面通过一个例 ...

  3. cobbler相关

    Cobbler通过将设置和管理一个安装服务器所涉及的任务集中在一起,从而简化了系统配置.相当于Cobbler封装了DHCP.TFTP.XINTED等服务,结合了PXE.kickstart等安装方法,可 ...

  4. Caused by: java.nio.charset.MalformedInputException: Input length = 1

    java.lang.IllegalStateException: Failed to load property source from location 'classpath:/applicatio ...

  5. redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现?

    redis的过期策略都有哪些? 设置过期时间: set key 的时候,使用expire time,就是过期时间.指定这个key比如说只能存活一个小时?10分钟?指定缓存到期就会失效. redis的过 ...

  6. Docker 安装mysql、oracle

    来源:唐山网站优化 Docker 安装mysql.oracle 使用ssh工具登录docker docker 的ip一般默认为192.168.99.100可以通过安装docker-machine之后, ...

  7. com.alibaba.fastjson把JSONObject转换为Map<String, String>对象

    https://www.cnblogs.com/fomeiherz/p/6351287.html JSONObject obj = new JSONObject();{obj.put("ke ...

  8. Codeforces Round #604 (Div. 2) B. Beautiful Numbers

    链接: https://codeforces.com/contest/1265/problem/B 题意: You are given a permutation p=[p1,p2,-,pn] of ...

  9. jQuery弹出提示信息自动消失简洁版

    // 在bootstrap中可以,可以使用如下方式实现弹出提示信息自动消失,如果没有使用bootstrap框架,可以自定义样式 //tip是提示信息,type:'success'是成功信息,'dang ...

  10. ORA-609 错误分析及解决方法 (转载)

    某个客户数据库在巡检的时候发现alert日志里不定期会出现ORA-609错误,大致内容如下: ***************************************************** ...