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;

}


    Write a Reply...