If I do:

  session.getFilterChain().addLast("peerWireFilter", new
ProtocolCodecFilter(codec));

instead of

  session.getFilterChain().addFirst("peerWireFilter", new
ProtocolCodecFilter(codec));

I get this message (occasionally):

RECEIVED: DirectBuffer[pos=0 lim=6 cap=8192: 00 00 00 02 05 FE]

Which is the message I'm expecting. However, if I do the addFirst,
then I get no log printout. I've run Ethereal to check if the packets
I'm looking for are being sent and it's definitely sending the packet
to me, but it's not always being picked up by MINA, that's for sure.
It's very spotty if the message is received (changing of filters or
not).

I'll keep working on it and let you know if I figure anything out.

Cheers,
 Tyler

On 5/14/06, Trustin Lee <[EMAIL PROTECTED]> wrote:
On 5/15/06, Tyler Pitchford <[EMAIL PROTECTED]> wrote:
>
> I can't seem to find an answer to this and I am getting very spotting
> results (looks like threading issues). I'm tyring to build a
> BitTorrent Filter for MINA, but I can't seem to get everything working
> correctly.
>
> To understand that situation, you'll need a little background on the
> BT protocol. When connecting to a peer a "handshake" message is sent,
> nothing unusual here, right? Well, sadly the handshake doesn't follow
> the wire header format. The Handshake uses a singly byte for it's
> header and the wire messages use a 4 byte header.
>
> Anyway, to handle it "cleanly" (probably not the fastest, but nicely
> architecturally), I developed a PeerWireHandshakeCodecFactory and a
> PeerWireCodecFactory. I could just change the header length, once the
> handshake was received, but I don't want to mix the handshake / wire
> messages, because in my opinion they should be handled separately.
> Anyway, I'm currently trying to do this is once the handshake response
> is received (handshake part is working correctly), I call:
>
> public void messageReceived(IoSession session, Object message){
> if (message instanceof PeerWireHandshakeMessage) {
>   synchronized(session){
>     session.getFilterChain().remove("handshakeFilter");
>     ProtocolCodecFactory codec = new PeerWireCodecFactory();
>     session.getFilterChain().addFirst("peerWireFilter", new
> ProtocolCodecFilter(codec));
>   }
> }
>
> The problem I'm seeing is that the PeerWire Encoders/Decoders never
> seem to get called. I've only seen them called one time, while
> debugged, which makes me think it's a threading issue. Any help /
> advice would be lovely. I'm not opposed to changing the architecture,
> if needed.


Do you get a raw ByteBuffer in messageReceived() when you switch the filter
instead PeerWireCodecFactory is active?  If so, it's not a bug but you need
a little bit more coding.  Otherwise, it can be a bug.  Please let us know
first.

P.S. you should update the mailing list link of the website. Sorry
> about the email to [EMAIL PROTECTED]


Thanks for the heads up.  We will fix it soon.

HTH,
Trustin
--
what we call human nature is actually human habit
--
http://gleamynode.net/
--
PGP key fingerprints:
* E167 E6AF E73A CBCE EE41  4A29 544D DE48 FE95 4E7E
* B693 628E 6047 4F8F CFA4  455E 1C62 A7DC 0255 ECA6


Reply via email to