我需要通过套接字发送一个namedtuples数组。
要创建一个namedtuples数组,我使用de follow:
listaPeers=[]
for i in range(200):
ipPuerto=collections.namedtuple('ipPuerto', 'ip, puerto')
ipPuerto.ip="121.231.334.22"
ipPuerto.puerto="8988"
listaPeers.append(ipPuerto)
现在已经填满,我需要打包“listaPeers [200]”
我该怎么做?
有点像?:
packedData = struct.pack('XXXX',listaPeers)
答案 0 :(得分:1)
首先,您错误地使用了namedtuple。看起来应该是这样的:
# ipPuerto is a type
ipPuerto=collections.namedtuple('ipPuerto', 'ip, puerto')
# theTuple is a tuple object
theTuple = ipPuerto("121.231.334.22", "8988")
至于包装,这取决于你想要在另一端使用什么。如果Python将读取数据,您可以使用Pickle模块。
import cPickle as Pickle
pickledTuple = Pickle.dumps(theTuple)
你可以一次腌制整个阵列。
答案 1 :(得分:0)
这不是那么简单 - 是的,对于整数和简单数字,可以直接从命名元组打包到struct包提供的数据。
但是,您将数据保存为字符串,而不是数字 - 在端口的情况下转换为int是一件简单的事情 - 因为它是一个简单的整数,但是当涉及到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)
)
然后你使用&#34; pack&#34;从这里开始,按照你想要的方式打包你的结构。
但首先,尝试创建你的&#34; listaPiers&#34;错误(你的示例代码只会因为IndexError而失败) - 使用一个空列表,并在其上添加append方法以插入带有ip / port对的新命名元组作为每个元素:
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)
答案 2 :(得分:0)
如果服务器进程从不受信任的客户端接收pickle数据,则认为pickle在服务器进程中被认为是不安全的。
您可能想要为记录和字段(可能是\ 0和\ 001或\ 376和\ 377)提供某种分隔符。然后组合一条消息就像一个文本文件分成记录和由空格和换行符分隔的字段。或者就此而言,如果普通数据不包含这些内容,则可以使用空格和换行符。
我发现这个模块对于基于套接字的协议中的数据框架非常有价值: http://stromberg.dnsalias.org/~strombrg/bufsock.html 它允许您执行诸如“读取直到下一个空字节”或“读取接下来的10个字符”之类的操作 - 而无需担心IP聚合或拆分数据包的复杂性。