给出程序先:

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. Codeforces J. A Simple Task(多棵线段树)

    题目描述: Description This task is very simple. Given a string S of length n and q queries each query is ...

  2. selenium 全天课整理(二)

    # encoding=utf-8 ''' selenium 全天 二 ''' #unittest例子 from selenium import webdriver import unittest,ti ...

  3. 《你说对就队》第八次团队作业:Alpha冲刺 第三天

    <你说对就队>第八次团队作业:Alpha冲刺 第三天 项目 内容 这个作业属于哪个课程 [教师博客主页链接] 这个作业的要求在哪里 [作业链接地址] 团队名称 <你说对就队> ...

  4. MarkDowm——语法篇

    前言 文档地址: http://www.markdown.cn/ 为了自己更熟悉MarkDown的语法,做个练习吧,以后博文打算用MarkDown直接写了. 标题 Markdown 支持两种标题的语法 ...

  5. 2019-2020-1 20199312《Linux内核原理与分析》第十一周作业

    实验简介 缓冲区溢出是指程序试图向缓冲区写入超出预分配固定长度数据的情况.这一漏洞可以被恶意用户利用来改变程序的流控制,甚至执行代码的任意片段.这一漏洞的出现是由于数据缓冲器和返回地址的暂时关闭,溢出 ...

  6. [Angular 8] Keep original DOM structure with ng-container

    ng-container is using for grouping elments together, a bit similar to div. If you want to group some ...

  7. Storm 安装时 部分supervisor启动成功,并不在web ui上显示

    今天帮公司搭建集群时,发现启动了三个Supervisor 发现只有一个显示在Web UI 上. 于是我就简单地检查了下另外两台没有启动的 storm supervisor的日志, 发现没有报出什么异常 ...

  8. PHP-FPM 的工作整理

    1.php-fpm的配置文件 根据命令找到路径修改配置文件 ps -ef|grep php-fpm vim /home/php/etc/php-fpm.conf ;;;;;;;;;;;;;;;;;; ...

  9. printf的使用

    #!/bin/bashprintf "|------------------------------------\n"printf "this is printf str ...

  10. 9、共享变量(Broadcast Variable和Accumulator)

    一.共享变量 1.共享变量工作原理 Spark一个非常重要的特性就是共享变量. 默认情况下,如果在一个算子的函数中使用到了某个外部的变量,那么这个变量的值会被拷贝到每个task中.此时每个task只能 ...