Es ist nicht so einfach - Ja, für ganze Zahlen und einfache Zahlen ist es möglich, direkt von benannten Tupeln zu Daten zu packen, die vom struct-Paket bereitgestellt werden.
Allerdings halten Sie Ihre Daten als Zeichenfolgen, nicht als Zahlen - es ist eine einfache Sache, im Fall des Ports in int zu konvertieren - wie es eine einfache ganze Zahl ist, erfordert aber etwas Jonglieren, wenn es darum geht IP.
def ipv4_from_str(ip_str):
parts = ip_str.split(".")
result = 0
for part in parts:
result <<= 8
result += int(part)
return result
def ip_puerto_gen(list_of_ips):
for ip_puerto in list_of_ips:
yield(ipv4_from_str(ip_puerto.ip))
yield(int(ip_puerto.puerto))
def pack(list_of_ips):
return struct.pack(">" + "II" * len(list_of_ips),
*ip_puerto_gen(list_of_ips)
)
Und Sie verwenden dann die "Pack" -Funktion von hier, um Ihre Struktur zu packen, wie Sie scheinen wollen.
Aber zuerst, versuchen Sie die Tatsache, dass Sie Ihre "listaPiers" falsch erstellen (Ihr Beispielcode wird einfach mit einem IndexError fehlschlagen) - verwenden Sie eine leere Liste und die Append-Methode, um neue benannte Tupel mit IP einzufügen/Port-Paare, wie jedes Element:
listaPiers = []
ipPuerto=collections.namedtuple('ipPuerto', 'ip, puerto')
for x in range(200):
new_element = ipPuerto("123.123.123.123", "8192")
listaPiers.append(new_element)
data = pack(listaPiers)
Wie Sie auch andere Tupel tun. – Marcin
Danke. Sie wollen jedes namedtuple einzeln verpacken und eins nach dem anderen schicken? – saimonx
Sie können sie separat packen und die Ergebnisse verketten. – alexis