Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python setsockopt工作原理是什么_Python_Sockets - Fatal编程技术网

python setsockopt工作原理是什么

python setsockopt工作原理是什么,python,sockets,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

该代码中有什么错误:

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”中是否存在任何错误。
是一种服务器,它不会执行命令并有一个超时

谢谢

在64位linux上,Struct timeval是16位的。更一般地说,我认为至少在大多数64位平台上,应该在结构调用中使用64位整数。 这是丑陋的,因为它依赖于体系结构和操作系统。 所以试试看
结构包('ll',int(2),int(0))

山姆·哈特曼的建议是正确的。最简单的方法是

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)

注意这不是万无一失的
sys.maxsize
如果混合了体系结构(64位操作系统上的32位python等),则可能会报告错误。

99%的情况下,除了您的代码之外,任何代码中都没有bug。不是说这不是1%,只是这不是你应该开始寻找的地方。