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)