first commit

This commit is contained in:
2022-12-16 20:36:45 +08:00
parent 20c5f58f64
commit 6db140f57d
8 changed files with 987 additions and 141 deletions
+90 -2
View File
@@ -1,4 +1,12 @@
<?php
/**
* Workerman DNS Protocol
* @author Enoch EchoNoch Enoch@laysense.com
* @Repo http://git.laysense.com/enoch/workerman-dns
* @Github http://github.com/ywnsya/workerman-dns
* @license http://www.opensource.org/licenses/mit-license.php MIT License
*/
namespace Workerman\Protocols;
class Dns
{
@@ -91,6 +99,81 @@ class Dns
$n=$n+1;
};
break;
case 'SOA':
$type='0006';
$ns=$buffer->detail;
$ns=json_decode( json_encode( $ns),true);
if($ns['type']=='none'){
$Rns=dns_get_record($ns['name'],DNS_SOA);
$Rns=$Rns[0];
$ns=$Rns;
$buffer->ttl=$Rns['ttl'];
}
$nss=explode('.',$ns['mname']);
$detail[0]='';
foreach($nss as $part){
$len=str_pad(dechex(strlen($part)),2,"0",STR_PAD_LEFT);
$tpart=bin2hex($part);
$detail[0]=$detail[0].$len.$tpart;
};
$detail[0]=$detail[0].'00';
unset($nss,$len,$tpart);
$nss=explode('.',$ns['rname']);
foreach($nss as $part){
$len=str_pad(dechex(strlen($part)),2,"0",STR_PAD_LEFT);
$tpart=bin2hex($part);
$detail[0]=$detail[0].$len.$tpart;
};
$detail[0]=$detail[0].'00'.str_pad(dechex($ns['serial']),8,"0",STR_PAD_LEFT).str_pad(dechex($ns['refresh']),8,"0",STR_PAD_LEFT).str_pad(dechex($ns['retry']),8,"0",STR_PAD_LEFT).str_pad(dechex($ns['expire']),8,"0",STR_PAD_LEFT).str_pad(dechex($ns['minimum-ttl']),8,"0",STR_PAD_LEFT);
$lenth[0]=str_pad(dechex((strlen($detail[0])/2)),4,"0",STR_PAD_LEFT);
break;
case 'AAAA':
$type='001C';
$ip=$buffer->detail;
$n=0;
foreach($ip as $i){
$detail[$n]="$i";
$lenth[$n]="0010";
$n=$n+1;
};
break;
case 'TEXT':
$type='0010';
$ns=$buffer->detail;
$n=0;
foreach($ns as $i){
$detail[$n]='';
$text=bin2hex($i);
$tlen=str_pad(dechex((strlen($text)/2)),2,"0",STR_PAD_LEFT);
$detail[$n]=$tlen.$text;
$lenth[$n]=str_pad(dechex((strlen($detail[$n])/2)),4,"0",STR_PAD_LEFT);
$n=$n+1;
};
break;
case 'MX':
$type='000F';
$ns=$buffer->detail;
$n=0;
print_r($ns);
foreach($ns as $i){
$nss=explode('.',$i->name);
$detail[$n]='';
foreach($nss as $part){
#$len=strlen($part);
$len=str_pad(dechex(strlen($part)),2,"0",STR_PAD_LEFT);
$tpart=bin2hex($part);
$detail[$n]=$detail[$n].$len.$tpart;
};
$detail[$n]=$detail[$n].'00';
$lenth[$n]=str_pad(dechex((strlen($detail[$n])/2)+2),4,"0",STR_PAD_LEFT).str_pad(dechex($i->pre),4,"0",STR_PAD_LEFT);
$n=$n+1;
};
break;
}
$ttl=str_pad(dechex($buffer->ttl),8,"0",STR_PAD_LEFT);
$status='8180';
@@ -108,7 +191,6 @@ class Dns
$answer=$answer.'C00C'.$type.'0001'.$ttl.$rlenth.$c;
}
$response=$buffer->id.$status.$questions.$AnswerRRs.$AuthorityRRs.$AdditionalRRs.$buffer->query.$answer;
echo $response;
return hex2bin($response);
}
@@ -133,6 +215,9 @@ class Dns
case '000c':
$type='PTR';
break;
case '0006':
$type='SOA';
break;
case '001c':
$type='AAAA';
break;
@@ -141,7 +226,10 @@ class Dns
break;
case '0010':
$type='TEXT';
break;
break;
case '000f':
$type='MX';
break;
}
$name=substr($data,24,-8);
$namede=str_split($name,2);