当前位置: 首页 > 面试题库 >

如何获得无阻塞套接字connect()?

盖锐
2023-03-14
问题内容

我这里有一个很简单的问题。我需要同时与许多主机进行通信,但是我真的不需要任何同步,因为每个请求都足够自给自足。

因此,我选择使用异步套接字,而不是发送垃圾邮件。现在我确实有一个小问题:

异步的东西就像一个咒语一样工作,但是当我连接到100个主机时,我得到100个超时(超时= 10秒),然后我等待1000秒,只是发现我所有的连接都失败了。

有什么办法也可以使套接字连接无阻塞吗?我的套接字已经设置为nonBlocking,但是对connect()的调用仍然处于阻塞状态。

减少超时不是可接受的解决方案

我正在Python中执行此操作,但我猜编程语言在这种情况下并不重要。

我真的需要使用线程吗?


问题答案:

您还需要并行化连接,因为设置超时时套接字会阻塞。或者,您无法设置超时,而是使用选择模块。

您可以使用asyncore模块中的dispatcher类进行此操作。看一下基本的HTTP客户端示例。该类的多个实例在连接时不会互相阻塞。您可以使用线程轻松地做到这一点,而且我认为使跟踪套接字超时变得更容易,但是由于您已经在使用异步方法,因此您最好还是走在同一个轨道上。

例如,以下内容适用于我的所有Linux系统

import asyncore, socket

class client(asyncore.dispatcher):
    def __init__(self, host):
        self.host = host
        asyncore.dispatcher.__init__(self)
        self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
        self.connect((host, 22))

    def handle_connect(self):
        print 'Connected to', self.host

    def handle_close(self):
        self.close()

    def handle_write(self):
        self.send('')

    def handle_read(self):
        print ' ', self.recv(1024)

clients = []
for i in range(50, 100):
    clients.append(client('cluster%d' % i))

asyncore.loop()

在cluster50-cluster100中,有许多机器无响应或不存在。这将立即开始打印:

Connected to cluster50
  SSH-2.0-OpenSSH_4.3

Connected to cluster51
  SSH-2.0-OpenSSH_4.3

Connected to cluster52
  SSH-2.0-OpenSSH_4.3

Connected to cluster60
  SSH-2.0-OpenSSH_4.3

Connected to cluster61
  SSH-2.0-OpenSSH_4.3

...

但是,这没有考虑必须阻塞的getaddrinfo。如果您在解决dns查询时遇到问题,则必须等待一切。您可能需要自己收集DNS查询,并在异步循环中使用IP地址

如果您想要比异步异步开发工具更大的工具包,请查看Twisted
Matrix
。入门有些繁琐,但这是您可以获得的python最好的网络编程工具包。



 类似资料:
  • 问题内容: 为什么有人会喜欢阻止写而不是非阻止写?我的理解是,仅当您想确保写方法返回后,另一端获得了TCP数据包时,才希望阻止写操作,但是我什至不知道这是可能的。您将必须刷新,而刷新则必须刷新 底层操作系统的写套接字缓冲区 。那么,无阻塞套接字写是否有任何缺点?就性能而言,拥有较大的底层写套接字是否会缓冲一个不好的主意?我的理解是,底层套接字写缓冲区越小,当底层套接字缓冲区已满且isWritabl

  • 问题内容: 我想创建一个非阻塞连接。像这样: 为此,我使用了另一个线程,无限循环和Linux epoll。像这样(伪代码): 如果我先运行服务器,然后运行客户端,那么一切正常。如果我先运行客户端,请稍等一会儿,再运行服务器,然后客户端将无法连接。 我究竟做错了什么?也许可以做不同的事情? 问题答案: 您应该使用以下步骤进行异步连接: 用创建套接字 开始与 如果返回值既不是也不是,则中止并返回错误

  • 问题内容: OpenSSL库允许使用SSL_read从基础套接字读取并使用SSL_write对其进行写入。这些函数可能会根据其SSL协议需求(例如,在重新协商连接时),以SSL_ERROR_WANT_READ或SSL_ERROR_WANT_WRITE返回。 我不太了解API希望我如何处理这些结果。 对一个接受客户端连接的服务器应用程序进行映像,建立一个新的ssl会话,使基础套接字成为非阻塞状态,然

  • 我正在编写一个需要向连接的远程主机发送数据的tcp服务器。我更希望套接字发送呼叫永远不要阻塞。为了方便起见,我使用了Socket。选择以标识可写套接字并使用Socket.Send写入这些套接字。插座。选择msdn文章状态: 如果您已经建立了连接,可写性意味着所有发送操作都将成功而不会阻塞。 我担心远程套接字没有主动耗尽缓冲区的情况,所述缓冲区填充,并且 tcp 推回我的服务器套接字。在这种情况下,

  • 我有一个小问题与Android和IOS之间实现套接字连接。当我使用我的应用程序连接两个Android运行设备时,一切正常。但是当我必须从Iphone应用程序接收一些数据时,我的readStream函数被阻塞,我可以在另一个部分关闭套接字后接收所有数据,这样我就不能返回任何响应。以下是我用来听的: 这里是我用来将转换为的函数: Iphone/Android应用程序的工作原理如下: 首先,它创建Soc

  • 问题内容: 当我直接使用(没有诸如Scanner之类的界面)接收数据时,它不会阻塞。但是,当我尝试使用Scanner时(类似于我们从接收字符串的方式),它确实可以。我想知道这样做的原因,以及所连接的Socket提供给您的InputStream与in的不同之处。 用于测试的客户端(用于两个服务器) 挂起的代码: 不阻塞的代码: 问题答案: (我认为您已经知道了这一点,但是…) 该方法返回当前行的其余

  • 下面的代码允许服务器等待客户端连接到(已经绑定的)套接字。它在客户端连接到套接字时终止,或者在“server_run”取值0时终止:这允许代码的其他部分在合适的时候关闭服务器。 根据对另一个帖子(C:non blocking sockets with timeout:how to check if connection request was made?)的回答和评论,这不是一种方法,因为它涉及到

  • 这一次,第一个选项卡将等待5秒,第二个选项卡将等待10秒 为什么会这样?