在AsyncTcpConnection中,关于checkConnection的触发问题

0

源码:
$this->_socket = stream_socket_client("{$this->transport}://{$this->_remoteAddress}", $errno, $errstr, 0,
STREAM_CLIENT_ASYNC_CONNECT);



Worker::$globalEvent->add($this->_socket, EventInterface::EV_WRITE, array($this, 'checkConnection'));


请问,我故意把remoteAddress写成一个无效的地址,如3.3.3.3:3333,EV_WRITE的监听还是在4秒左右触发了checkConnection,这是为什么呢???

已邀请:

xiuwang

赞同来自:

为啥写一个无效地址就不能触发checkConnection?

xxfxxfxxfxxf

赞同来自:

<?php
global $eb,$client,$time;
$time=time();
$eb=new EventBase();
$timer=new Event($eb,-1,Event::TIMEOUT,function()use(&$timer){
$timer->add(1);
});
$client=stream_socket_client("tcp://3.3.3.3:2222",$errcode,$errstr,0,STREAM_CLIENT_ASYNC_CONNECT);
$et=new Event($eb,$client,Event::WRITE,function($client){
global $time;
echo time()-$time;
});
$et->add();
$timer->add(1);
$eb->loop();


我写的一个测试用例,发现不是4秒,是7秒触发的

xxfxxfxxfxxf

赞同来自:

具体细节不知道,但是大概原因知道了,因为/proc/sys/net/ipv4/tcp_syn_retries的含义是重发SYN包的次数,而我的虚拟机这个值是2,第一次3秒,第二次4秒,这两次发完后,认为这个连接已经失败了,发了一个信号(FIN?)给event,所以触发了checkConnection。细节我再想办法了解下。

要回复问题请先登录注册