python setsockopt什么是worng

时间:2017-09-28 20:06:39

标签: python sockets

该代码有什么问题:

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”中是否有任何错误。 是一种服务器谁不会lisent和超时 感谢

2 个答案:

答案 0 :(得分:1)

在64位Linux上,struct timeval是16个bites。更一般地说,我认为你应该在结构调用中使用64位整数,至少在大多数64位平台上。 这是建筑和操作系统相关的丑陋。 所以试试吧     struct.pack(' 11',INT(2),INT(0))

答案 1 :(得分:1)

山姆哈特曼的建议是合理的。绝对死路最简单的方法是:

<header id="header" class="header-vertical dark open">

请注意,这不是万无一失的。如果混合体系结构(64位操作系统上的32位python等),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) 可能会报错。