Gnutella Forums

Gnutella Forums (https://www.gnutellaforums.com/)
-   General Gnutella Development Discussion (https://www.gnutellaforums.com/general-gnutella-development-discussion/)
-   -   Writing Java client.. how should I implement query/query hits? (https://www.gnutellaforums.com/general-gnutella-development-discussion/22895-writing-java-client-how-should-i-implement-query-query-hits.html)

Tw|st3r December 13th, 2003 04:06 PM

Writing Java client.. how should I implement query/query hits?
 
Hello,
I am trying to write my GNUTella client using Java.

I wrote the code to find the first node on the network, then sent to it the "CONNECT GNUTELLA/0.6" message.

The servent correctly says "200 OK", and then.. how can I perform a search query?

At this point I got:
* the IP and port of the servent I am connected to
* its input and output streams.

The RFC says
Quote:

The message header is 23 bytes divided into the following fields.

Bytes: Description:
0-15 Message ID/GUID (Globally Unique ID)
16 Payload Type
17 TTL (Time To Live)
18 Hops
19-22 Payload Length
and
Quote:

A Query message has the following fields:

Bytes: Description:
0-1 Minimum Speed. The minimum speed (in kb/second) of servents
that should respond to this message. A servent receiving a
Query message with a Minimum Speed field of n kb/s SHOULD
only respond with a Query Hit if it is able to communicate at
a speed >= n kb/s.

2- Search Criteria. This field is terminated by a NUL (0x00). [...]
The Search Criteria is text, and it has never been specified which
charset that text was encoded with. Therefore, servents MUST assume
it is pure ASCII only.
so I built byte by byte the message giving a search criteria like "madonna" or stgh like that.

Finally I printed the bytes array to the output stream connected with the servent, but:

* if I read the servent reply on the input stream I got unuseful information about the servent.. nothing like the query hits

* if I create a ServerSocket bound to port 6346, this socket hungs on listening an never recieves anything



So.. what shall I do to get the query hits?

Thanks in advance

a_guest_in_the_machine December 26th, 2004 10:03 PM

I am also working with the protocol and trying to write my own client, but mine will be in Perl. I ran into a problem that sounded similar to yours.

I would send:

GNUTELLA CONNECT/0.6\r\n
\r\n

They would send:

GNUTELLA/0.6 200 (...)

And from what I was reading on all the documentation I could find about the protcol, it said that you should now be connected and able to send/receive ping/pong/query/queryhits.

But when I attempted to do any of this and read from the socket for my response, I would find (like you said) useful (text) information about my server. I would then eventually be disconnected from the server in less than a minute.

What I found out from (after hours of searching) an alternative document, that the handshake actually goes like:

client:
GNUTELLA CONNECT/0.6\r\n
\r\n

server:
GNUTELLA/0.6 200 (...)\r\n
(optional server specifics)\r\n
\r\n

client:
GNUTELLA/0.6 200\r\n
\r\n

And now, at this point you are offically connected, and we remain so indefinatly. And from what the documents say, you should now be able to send and receive ping/pong/query/queryhits.

I am not actually trying to work with sending a query at the moment, instead I am trying to understand how to send a ping.

This is where I become lost again. The protocol documentation that I have found is ver unclear about the specifics for sending communications at this point.

I hope the information I have shared will atleast help you get properly connected to the network. But as for the problem of sending a query, (or ping in my case) I do not know what to tell you.

Best of luck,
Jason


All times are GMT -7. The time now is 08:49 PM.

Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, vBulletin Solutions, Inc.
SEO by vBSEO 3.6.0 ©2011, Crawlability, Inc.

Copyright © 2020 Gnutella Forums.
All Rights Reserved.