Python 套接字超时问题。如何更好地控制这段代码的流程?

发布于 2024-11-07 02:25:43 字数 579 浏览 1 评论 0原文

在使用 python 2.7 中的套接字库时,我遇到了让代码按照我想要的方式流动的问题。我希望代码能够迭代一系列 IP 地址,并为该范围内的每个 ip 打开一个套接字连接。如果连接超时,则打印错误并移至该范围中的下一个地址。我使用 for 循环来完成此操作,但是每当套接字遇到超时时,循环就会中断。我做错了什么?我假设这是处理异常的方式。有人能指出我正确的方向吗?

from IPy import IP
ip = IP(sys.argv[1])
for x in ip:
    print("Connecting to: {0}".format(str(x)))
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10)
    svr = (str(x), 25)
    s.connect(svr)
    if socket.timeout:
        print("Timed out.")
    data = s.recv(2048)
    print(data)
    continue

print("Range Completed.")
sys.exit(1)

While working with the sockets library in python 2.7, I am encountering an issue with getting the code to flow the way I want it to. I'd like the code to iterate over a range of IP addresses and open a socket connection for each ip in the range. If the connection times out, print an error and move on to the next address in the range. I'm using a for loop to accomplish this, however whenever the socket encounters a time out, the loop breaks. What am I doing wrong? I'm assuming its the way the exception is being handled. Can anyone point me in the right direction?

from IPy import IP
ip = IP(sys.argv[1])
for x in ip:
    print("Connecting to: {0}".format(str(x)))
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10)
    svr = (str(x), 25)
    s.connect(svr)
    if socket.timeout:
        print("Timed out.")
    data = s.recv(2048)
    print(data)
    continue

print("Range Completed.")
sys.exit(1)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

没有你我更好 2024-11-14 02:25:43

我相信你不能在超时套接字上调用 s.recv(2048) 。我认为修改后的代码应该可以正常工作。

from IPy import IP
ip = IP(sys.argv[1])
for x in ip:
    print("Connecting to: {0}".format(str(x)))
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10)
    svr = (str(x), 25)
    s.connect(svr)
    if socket.timeout:
        print("Timed out.")
    else:
       data = s.recv(2048)
       print(data)
    continue

print("Range Completed.")
sys.exit(1)

You cannot call s.recv(2048) on a timedout socket I believe. I think this modified code should work fine.

from IPy import IP
ip = IP(sys.argv[1])
for x in ip:
    print("Connecting to: {0}".format(str(x)))
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    s.settimeout(10)
    svr = (str(x), 25)
    s.connect(svr)
    if socket.timeout:
        print("Timed out.")
    else:
       data = s.recv(2048)
       print(data)
    continue

print("Range Completed.")
sys.exit(1)
佼人 2024-11-14 02:25:43

你不用这个干什么?

 if socket.timeout:
    print("Timed out.")
 else:
     data = s.recv(2048)
     print(data)

What aren't you using this?

 if socket.timeout:
    print("Timed out.")
 else:
     data = s.recv(2048)
     print(data)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文