首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python setsockopt怎么回事

python setsockopt怎么回事
EN

Stack Overflow用户
提问于 2017-09-29 04:06:39
回答 2查看 1.6K关注 0票数 1

这段代码的错误之处在于:

代码语言:javascript
复制
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)

错误:

代码语言:javascript
复制
    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?是一种习惯于登录和暂停的服务器,谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-09-29 04:14:16

在64位linux上,Struct timeval为16位。一般而言,我认为至少在大多数64位平台上,您应该在struct调用中使用64位整数。这是丑陋的,这是架构和操作系统的依赖。所以试试struct.pack('ll',int(2),int(0))

票数 1
EN

Stack Overflow用户

发布于 2017-11-09 05:24:51

萨姆·哈特曼的建议是合理的。最简单的方法就是;

代码语言:javascript
复制
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可能会报告错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46477448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档