garbled data passed in cumulation buffer for decode(), probably when data re-transmission.
huican ping
pinghuican at gmail.com
Sat Sep 12 01:41:31 EDT 2009
Hello Trustin,
I have been looking at that garbled channel buffer for my FrameDecoder
case in these days.
FYI, my dummy frameDecoder for comming message with structure (for
example): StartByte+Any-Bytes-Different-Than-StartByte-Trailer+TrailerByte.
So far, I saw both the two failed cases for my 1066 bytes (results in
2 messageReceived calls).
a) good-1024-bytes + bad data. // Since I am waiting on the tailer
byte, so it receiveTimeout.
b) bad-1024-bytes + good data. // Since I found the trailer byte,
but there is no good startByte, so it is bad message.
1:) I captured and tcpdumped one failed case inside
million-and-million successful oens, and noticed that the client sent
in a good message to the server based on the FrameDecoder.
2:) and when I read the code at: FrameDecoder.java, method messageReceived().
Since the client can sends in a message which results in multiple
messageReceived Call (such as 2 for my input), I just wonder how the
code below to keep synchronizing the cumulation buffer for these if
and else cases. What I am worrying is that when the previous
messageReceived event at the else branch (not done yet), another
messageReceived event can go into the if branch.
Is this a problem?
Thanks
Huican Ping
===============
public void messageReceived(
ChannelHandlerContext ctx, MessageEvent e) throws Exception {
Object m = e.getMessage();
if (!(m instanceof ChannelBuffer)) {
ctx.sendUpstream(e);
return;
}
ChannelBuffer input = (ChannelBuffer) m;
if (!input.readable()) {
return;
}
ChannelBuffer cumulation = cumulation(ctx);
if (cumulation.readable()) {
cumulation.discardReadBytes();
cumulation.writeBytes(input);
callDecode(ctx, e.getChannel(), cumulation, e.getRemoteAddress());
} else {
callDecode(ctx, e.getChannel(), input, e.getRemoteAddress());
if (input.readable()) {
cumulation.writeBytes(input);
}
}
}
==========================
On Thu, Sep 10, 2009 at 10:17 PM, huican ping <pinghuican at gmail.com> wrote:
> Hello Trustin,
>
> I thought I found some place in my parser suspicious, now my logic is
> pretty much same as the example posted at the FrameDecoder page, and
> still get the same issue.
>
> // My decode() logic.
> protected Object decode(ChannelHandlerContext ctx, Channel channel,
> ChannelBuffer buffer) throws Exception {
>
> // return if the buffer empty
> if (buffer.readableBytes() <= 0) {
> return null;
> }
>
> // Mark the current buffer position before parsing the buffer
> // because the whole message might not be in the buffer yet.
> // We will reset the buffer position to the marked position in
> // that case.
> buffer.markReaderIndex();
>
>
> for ( loc = buffer.readerIndex(); loc < buffer.writerIndex(); loc++)
> {
> // Paser code.
> // if find the whole message, then return that message
> // otherwise, it will hit the end of the loop
> // Inside the loop
>
> // I didn't modify the buffer except change its readerIndex if
> // the whole message is not there yet.
> }
>
>
> // The whole message were not received yet - return null.
> // This method will be invoked again when more packets are
> // received and appended to the buffer.
>
> // Reset to the marked position to read the length field again
> // next time.
> buffer.resetReaderIndex();
> return null;
> }
>
> // my getPipeline() logic:
> pipeline.addLast("decoder", new acmeDecoder());
> pipeline.addLast("encoder", new acmeEncoder());
> pipeline.addLast("handler", new acmeServerHandler());
>
>
> Thanks
> Huican Ping
>
> On Thu, Sep 10, 2009 at 9:49 PM, Huican Ping <pinghuican at gmail.com> wrote:
>>
>> Hello Trustin,
>>
>> Probably it is my parser problem. Don't waste time on it now. I am
>> sorry about it.
>>
>> Thanks
>> Huican Ping
>>
>> On Thu, Sep 10, 2009 at 5:40 PM, Huican Ping (via Nabble)
>> <ml-user+135163-919750110 at n2.nabble.com> wrote:
>>> FYI, my decoder inherited from the FrameDecoder.
>>>
>>> Thanks
>>> Huican Ping
>
More information about the netty-users
mailing list