I'm trying to write a Gnutella client in PHP. In order to receive queries from the network I need to send a query routing table. So I've tried to generate a table that will have all queries sent to me so I can test my application. I'm having a bit of trouble generating the QRT table because when I send it I don't get a response from the other side indicating that I've messed it up.
Here's the spec: http://rfc-gnutella.sourceforge.net/src/qrp.html
I have a feeling I've done the binary math all wrong. Thoughts?
//write QRP reset message
$variant = "\0x0";
$table_length = pack('V',65535);
$infinity = pack('C',1);
$packet = $variant . $table_length . $infinity;
$reset = create_header( "\30x0", 1,0, $packet );
fwrite($fp, $reset,strlen($reset));
//4 kilobyte
$byte = '';
for ( $o = 0; $o < (1024*4); $o++){
$byte .= pack('C',1);
}
//write qrp table
$packet = '';
for ( $t =0; $t < 16; $t++ ){
$variant = "\0x1";
$seq_no = pack('C',$t+1);
$seq_size = pack('C',16); //bits
$compressor = "\0x0";
$entry_bits = pack('C',8);
$packet = $variant . $seq_no . $seq_size . $compressor . $entry_bits . $byte;
$packet = create_header("\30x0",1,0,$packet);
fwrite($fp,$packet, strlen($packet));
}
function create_header( $type, $ttl, $hops, $data ){
$header = pack("L",create_guid());
# Function
$header .= pack("C",$type);
# TTL
$header .= pack("C",$ttl);
# Hops
$header .= pack("C",$hops);
# Size
$header .= pack("L",strlen($data));
$f = is_valid_gnutella_header($header);
if ( ! $f ) {
echo "we just sent a bad gnutella header";
}
return $header . $data;
}