0

好的,所以我有一个使用的类,while(true)它使用套接字连接。现在我的问题是,当我使用 socket_set_nonblock 它没有连接它时,它会以“无法连接。”而死。当我在发送数据包后放置它时,它会从头开始并重新完成所有操作。

这是我的连接功能:

function connect($ip, $port) {
        if($this->soc!=null) socket_close($this->soc);
        $this->soc = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        if(!$this->soc) die(socket_strerror(socket_last_error($this->soc)));
        if(!socket_connect($this->soc,$ip,$port)) die("Could not connect."); 

    }

这是尝试使用 socket_set_nonblock 时的函数

function connect($ip, $port) {
        if($this->soc!=null) socket_close($this->soc);
        $this->soc = socket_create(AF_INET,SOCK_STREAM,SOL_TCP);
        socket_set_nonblock($this->soc);
        if(!$this->soc) die(socket_strerror(socket_last_error($this->soc)));
        if(!socket_connect($this->soc,$ip,$port)) die("Could not connect."); 

    }
4

1 回答 1

0

首先,您需要告诉我们为什么要将套接字置于非阻塞模式。主要原因有两个:

  • 在单个线程上多路复用多个文件描述符/套接字(取决于语言/平台)。
  • 为操作设置超时。

无论如何,非阻塞有两个阶段connect()

  • 启动连接。在 php 中,使用 完成socket_connect(),通常会以SOCKET_EINPROGRESS;失败。在这种情况下,您需要第二阶段:
  • 等待连接完成,然后检查状态。等待部分用 完成socket_select(),您可以在其中多路复用您正在等待事件的多个套接字。当它返回时,您需要遍历它返回的套接字;当您到达等待成功连接的套接字时,您可以使用socket_get_option($socket, SOL_SOCKET, SO_ERROR).
于 2012-11-04T12:08:55.977 回答