这段代码的错误之处在于:
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)错误:
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"socket.SO_RCVTIMEO“中有没有bug?是一种习惯于登录和暂停的服务器,谢谢
发布于 2017-09-29 04:14:16
在64位linux上,Struct timeval为16位。一般而言,我认为至少在大多数64位平台上,您应该在struct调用中使用64位整数。这是丑陋的,这是架构和操作系统的依赖。所以试试struct.pack('ll',int(2),int(0))
发布于 2017-11-09 05:24:51
萨姆·哈特曼的建议是合理的。最简单的方法就是;
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)注意,这并不是万无一失的。如果混合架构(64位操作系统上的32位python等),sys.maxsize可能会报告错误。
https://stackoverflow.com/questions/46477448
复制相似问题