【问题标题】:Generating a UDP message in python with a header and payload in python3使用 python3 中的标头和有效负载在 python 中生成 UDP 消息
【发布时间】:2022-11-30 06:21:01
【问题描述】:

我是网络新手,正在尝试使用 python3 实现网络计算器,其中客户端的责任是发送操作数和运算符,服务器将计算结果并将其发送回客户端。通信是通过 UDP 消息进行的,我在客户端工作。每条消息都由一个标头和一个有效负载组成,它们的描述如下图所示。

UDP 标头:

UDP 负载:

我熟悉使用套接字发送字符串消息,但很难理解如何使用标头和有效负载制作消息以及如何为各种属性分配位或如何在标头中生成消息/客户端 ID,如果有任何自动生成 Id 的方法。任何帮助或建议将不胜感激。

提前致谢

【问题讨论】:

  • 花一些时间阅读 struct.pack() 和 struct.unpack()
  • @user3435121 谢谢你的评论,我已经阅读了 struct.pack() 的编码,我看到一个整数(4 字节)可以打包和解包,我的整个头应该是 4 字节,这应该被分成5 个领域 关于如何进行的任何想法?有效载荷可以很容易地附加为它的 4* 整数,我对标题部分有点困惑

标签: python python-3.x sockets networking udp


【解决方案1】:

我只会做你的一部分作业。
我希望它能帮助您找到精力来处理缺失的部分。

import struct
import socket

CPROTO_ECODE_REQUEST, CPROTO_ECODE_SUCCESS, CPROTO_ECODE_FAIL = (0,1,2)

ver = 1  # version of protocol
mid = 0  # initial value
cid = 99 # client Id (arbitrary)

sock = socket.socket( ...) # to be customized

def sendRecv( num1, op, num2):
  global mid
  ocs = ("+", "-", "*", "/").index( op)
  byte0 = ver + (ocs << 3) + (CPROTO_ECODE_REQUEST << 6)
  hdr = struct.pack( "!BBH", byte0, mid, cid)
  parts1 = (b'0000' + num1.encode() + b'0000').split(b'.')
  parts2 = (b'0000' + num2.encode() + b'0000').split(b'.')
  msg = hdr + parts1[0][-4:] + parts1[1][:4] + parts2[0][-4:] + parts2[1][:4]
  
  socket.send( msg)         # send request
  bufr = socket.recv( 512)  # get answer
  # to do:
  #   complete socket_send and socket.recv
  #   unpack bufr into: verr,ecr,opr,value_i, value_f
  #   verify that verr, ecr, opr, are appropriate
  #   combine value_i and value_f into answer
  mid += 1
  return answer

result = sendRecv( '2.47', '+', '46.234')

您的老师没有指定许多元素:

  • 网络上的字节顺序应该是什么(大端还是小端)?上面的示例假设它是 bigEndian,但您可以轻松修改“pack”语句以使用 littleEndian。
  • 如果接收到的包头无效,程序应该怎么办?
  • 如果服务器没有应答,程序应该怎么办?
  • 有效载荷:我们应该如何解释“小数的 4 个最高有效数字”?这是否意味着该值是 ASCII 格式的?没有具体说明。
  • 有效载荷:假设分数是 ASCII 格式,它应该在数据包中右对齐还是左对齐?
  • 有效载荷:整数部分的相同问题。
  • 有效载荷:如果值是二进制的,它们是有符号的还是无符号的。会对解包语句产生影响。

在上面的程序中,我假设:

  • 值为正且为 ASCII(无符号)
  • 整数部分右对齐
  • 小数部分左对齐

玩得开心!

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多