Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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/3/sockets/2.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
Php 套接字设置非块错误_Php_Sockets - Fatal编程技术网

Php 套接字设置非块错误

Php 套接字设置非块错误,php,sockets,Php,Sockets,好的,我有一个类,它使用while(true)并使用套接字进行连接。现在我的问题是,当我使用socket\u set\u nonblock时,它不会连接,它会以“无法连接”结束。当我在发送一个数据包后把它放进去时,它会从头开始,然后重新做所有的事情 以下是我的连接功能: function connect($ip, $port) { if($this->soc!=null) socket_close($this->soc); $this->soc

好的,我有一个类,它使用
while(true)
并使用套接字进行连接。现在我的问题是,当我使用socket\u set\u 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."); 

    }
以下是尝试使用套接字\设置\非块时的函数

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."); 

    }

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

  • 在单个线程上多路复用多个文件描述符/套接字(取决于语言/平台)
  • 为操作设置超时
无论如何,非阻塞连接()有两个阶段:

  • 启动一个连接。在php中,使用
    socket\u connect()
    完成,通常使用
    socket\u EINPROGRESS
    失败;在这种情况下,您需要第二阶段:
  • 等待连接完成,然后检查状态。等待部分是通过
    socket\u select()
    完成的,在这里,您可以多路传输正在等待事件的多个套接字。当它返回时,您需要迭代它返回的套接字;当您到达等待成功连接的套接字时,可以使用
    socket\u get\u选项($socket,SOL\u socket,SO\u ERROR)
    检查连接结果

如果您查看了PHP错误,您会发现您的问题与:我不明白,您能解释一下我是如何修复的吗?而且那不是php