PHP模拟telnet function creatSock($host="127.0.0.1",$port=23){ /*建立并返回网络连接*/ $fp = fsockopen($host,$port, $errno, $errstr, 30); if (!$fp) { return false; } else { stream_set_timeout($fp, 30); return $fp; } }function read_
function creatSock($host="127.0.0.1",$port=23){ /*建立并返回网络连接*/ $fp = fsockopen($host,$port, $errno, $errstr, 30); if (!$fp) { return false; } else { stream_set_timeout($fp, 30); return $fp; } } function read_till($sock,$what="Username:",$seWhat=''){ $buf = ''; if($seWhat=='')$seWhat=$what; /* 使用2个搜索字以应对出现的2种情况 */ while (true) { /* chr()返回相对应于 ascii 所指定的单个字符 从 0 到 31 的数字表示标准的不可打印的 ASCII 代码 通过查ASCII码表知 0 = NULL(空) 只有0-127 */ $IAC = chr(255);// $DONT = chr(254);// $DO = chr(253);// $WONT = chr(252);// $WILL = chr(251);// $theNULL = chr(0);//空字符 /* fgetc从文件指针中读取一个字符. 怎么判断已经读完了所有字符? if ($c === false) if ($c == $theNULL) if ($c != $IAC){}else{} */ $c = fgetc($sock); //echo ord($c).''; if ($c === false) return $buf;//如果文件指针返回假则直接返回终止 if ($c == $theNULL) {continue;} /* 空字符,本次终止,进入下一次循环 空字符说明,连接正常,只是当前连接没有收到返回的字符。 */ //if ($c == "1") {continue;}//? 这样所有的1都不会被读出来! if ($c != $IAC) { //此时连接返回的字符是正常字符 $buf .= $c;//让之前读取的字符与本次读取的字符连接 /* strlen($buf)字符串的总长度 strlen($what)查找字符串的长度 substr(string,start,length)返回字符串 string 由 start 和 length 参数指定的子字符串 即从所有已经返回的字符中,从总长-查询长的位置截取字符串? $buf=abcdefg $what=cde 返回efg 即:只从接收到的字符串中返回,最后的,与查询字符串长度相同的子字符串与查询字符相比较! 所以,输入的要查询的字符串应当在返回字符串的最后面! */ if("Error:"==substr($buf,strlen($buf)-6)){ return $buf;//检索到错误后返回结果。 } if($seWhat==substr($buf,strlen($buf)-strlen($seWhat))){ return $buf;//检索到第2关键字后返回结果。 } if($what == (substr($buf,strlen($buf)-strlen($what)))) { return $buf;//检索到第1关键字后返回结果,否则进入下一次循环。 }else{ continue; } } $c = fgetc($sock); if ($c == $IAC) { $buf .= $c; }else if (($c == $DO) || ($c == $DONT)) { $opt = fgetc($sock); // echo "we wont ".ord($opt)."\n"; fwrite($sock,$IAC.$WONT.$opt); }elseif (($c == $WILL) || ($c == $WONT)) { $opt =fgetc($sock); // echo "we dont ".ord($opt)."\n"; fwrite($sock,$IAC.$DONT.$opt); }else { // echo "where are we? c=".ord($c)."\n"; } } } public function write($sock,$buffer) { /*使用网络连接写入数据*/ $buffer = str_replace(chr(255),chr(255).chr(255),$buffer); fwrite($sock,$buffer); }