Python 为什么生存时间(ttl)使用struct打包?

Python 为什么生存时间(ttl)使用struct打包?,python,python-3.x,sockets,ttl,multicastsocket,Python,Python 3.x,Sockets,Ttl,Multicastsocket,我在PyMOTW3()一书中偶然发现了一些代码,我无法理解为什么生存时间(ttl)参数被打包为struct.pack('b',1) 我试图搜索手册,看看这些参数是否应该被压缩,但它表明它可以是整数。我试着输入一个正常的整数,它似乎工作得很好。它给出了与下面代码相同的输出。那么,它被如此包装的具体原因是什么呢? 我知道没有必要将其打包为1,因为默认值为1,但如果我需要使用其他数字该怎么办。我需要打包吗 我已经包括了下面这本书中的代码 import socket import struct impo

我在PyMOTW3()一书中偶然发现了一些代码,我无法理解为什么生存时间(ttl)参数被打包为struct.pack('b',1)

我试图搜索手册,看看这些参数是否应该被压缩,但它表明它可以是整数。我试着输入一个正常的整数,它似乎工作得很好。它给出了与下面代码相同的输出。那么,它被如此包装的具体原因是什么呢? 我知道没有必要将其打包为1,因为默认值为1,但如果我需要使用其他数字该怎么办。我需要打包吗

我已经包括了下面这本书中的代码

import socket
import struct
import sys

message = b'very important data'
multicast_group = ('224.3.29.71', 10000)

# Create the datagram socket
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)

# Set a timeout so the socket does not block
# indefinitely when trying to receive data.
sock.settimeout(0.2)

# Set the time-to-live for messages to 1 so they do not
# go past the local network segment.
ttl = struct.pack('b', 1)
sock.setsockopt(socket.IPPROTO_IP, socket.IP_MULTICAST_TTL, ttl)
print(s.getsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL))

try:

    # Send data to the multicast group
    print('sending {!r}'.format(message))
    sent = sock.sendto(message, multicast_group)

    # Look for responses from all recipients
    while True:
        print('waiting to receive')
        try:
            data, server = sock.recvfrom(16)
        except socket.timeout:
            print('timed out, no more responses')
            break
        else:
            print('received {!r} from {}'.format(
                data, server))

finally:
    print('closing socket')
    sock.close()
无论是打包还是使用普通整数,这都是我得到的输出

一,

发送非常重要的信息

超时

闭合插座


所有数据包都由字节组成

对于AF_INET或an,您可以在中看到数据包属性之间的位分布。您可以在IPv4标头中看到,是20的第9个八位组。TTL是一个8位(1字节)字段,可以是0到255

也就是说,每个属性都应该采用一定数量的位

为此,Python3.7有一个模块。此模块在Python值和表示为Python字节对象的C结构之间执行转换

由于TTL是一个大小为1字节的正整数,我们必须选择无符号字符类型,即“B”

现在代码如下所示:

ttl=struct.pack('B',25)#作为1字节对象的无符号字符
sock.setsockopt(socket.IPPROTO_IP,socket.IP_MULTICAST_TTL,TTL)
TTL是8位,因此不是2字节。