给出程序先:

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. 小顶堆---非递归C语言来一发

    #include <stdio.h> #include <stdlib.h> #define HEAP_SIZE 100 #define HEAP_FULL_VALUE -10 ...

  2. 微信小程序API~用户信息

    UserInfo 用户信息 属性 string nickName 用户昵称 string avatarUrl 用户头像图片的 URL.URL 最后一个数值代表正方形头像大小(有 0.46.64.96. ...

  3. Spring4 -03 -Dependency Injection (依赖注入) : 代码体现/配置xml/测试

    DI:中文名称:依赖注入 英文名称((Dependency Injection) DI 是什么? 3.1 DI 和IoC 是一样的,差不多一样的技术和模板! 3.2 当一个类(A)中需要依赖另一个类( ...

  4. 怎么保证redis集群的高并发和高可用的?

    redis不支持高并发的瓶颈在哪里? 单机.单机版的redis支持上万到几万的QPS不等. 主要根据你的业务操作的复杂性,redis提供了很多复杂的操作,lua脚本. 2.如果redis要支撑超过10 ...

  5. *DataSet序列化,这段代码研究

    DataSet序列化,这段代码研究研究.学习学习. using System; using System.Collections.Generic; using System.Linq; using S ...

  6. Tomcat默认连接超时时间

    秒=1小时 2. 在web.xml中通过参数指定: xml 代码 <session-config>         <session-timeout>30</sessio ...

  7. IDEA快速实现接口快捷方式

    IDEA快速实现接口快捷方式 ALT +INSERT

  8. Oracle ACS 绑定变量窥视 条件

    1. ACS简介 Oracle Database 11g提供了Adaptive Cursor Sharing (ACS)功能,以克服以往不该共享的游标被共享的可能性.ACS使用两个新指标:sensit ...

  9. (尚017)Vue插件

    1.如何开发插件? 2.编写自己的vue-myPlugin.js插件库,代码如下: /** * vue的插件库 * 最好使用匿名函数包裹起来,这样代码会更加规范 * 里面的实现被隐藏了 */(func ...

  10. 关于bootstrap的双层遮罩问题

    在使用bootstrap的双层遮罩时 遇到这么2个问题 第一个是当关闭遮罩里面层遮罩时滚动条会向左溢出 第二个也是当关闭遮罩里面层遮罩时 在第一层遮罩的内容相当于固定住了 拖动滚动条也只能显示他固定住 ...