2017-09-28 3 views
1

ce qui est faux dans ce code:python setsockopt ce qui est worng

def iec104(dst): 
    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    time = struct.pack('ii', int(2), 0) 
    sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, time) 

try: 
    sock.connect(dst) 
except: 
    return '', -1 


dst = (ip, 2404) 
recv, asdu_addr = iec104(dst) 
print "ip: {0}, recv: {1}, asdu_addr: {2}".format(ip, 
recv.encode('hex'), asdu_addr) 

erreur:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, time) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/socket.py", line 228, in meth 
return getattr(self._sock,name)(*args) 
socket.error: [Errno 22] Invalid argument 

Y at-il bug dans "socket.SO_RCVTIMEO". Est un type de serveur qui a l'habitude d'avoir un timeout Merci

+0

99% du temps, il n'y a pas de bogue dans un code autre que le vôtre. Ne pas dire que ce n'est pas 1%, ce n'est pas là que vous devriez commencer à regarder. –

Répondre

0

Struct timeval est 16 bits sur linux 64 bits. Plus généralement, je pense que vous devriez utiliser des entiers 64 bits dans votre appel struct au moins sur la plupart des plateformes 64 bits. Il est moche que cela dépend de l'architecture et du système d'exploitation. Alors essayez struct.pack ('ll', int (2), int (0))

0

Les conseils de Sam Hartman sont solides. Le moyen le plus simple et le plus mort est de le faire.

import sys, socket, struct 
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
if sys.maxsize > 2**32: 
    time = struct.pack(str("ll"), int(2), int(0)) 
else: 
    time = struct.pack(str("ii"), int(2), int(0)) 
sock.setsockopt(socket.SOL_SOCKET, socket.SO_RCVTIMEO, time) 

Notez que ce n'est pas infaillible. sys.maxsize peut signaler de manière incorrecte si les architectures de mélange (Python 32 bits sur OS 64 bits, etc.).