Начало переадресованного сообщения:

> От: Gordiychuck Oleg <[email protected]>
> Дата: 7 лютого 2011 р. 00:04:43 GMT+02:00
> Кому: [email protected]
> Тема: Read callback problem
> 
> Hello!
> 
> I have a simple network application with simple protocol over TCP\IP. The 
> main idea of protocol is size+message model. So at first i'm sending size of 
> message (coded in big-endian, first 4 bytes) than the whole message. 
> I'm using event2 and read data from OnRead callback which i set and enabled 
> to bufferevent with next code:
> 
> static void OnRead(struct bufferevent *bev, void *user_data)
> {
>       int buf_len = evbuffer_get_length(bufferevent_get_input(bev));
>       ConnectionContext *ctx = user_data;
>       uint8_t size_data[4],*data;
> 
>       printf("bytes avaliable this call: %d\n",buf_len); // always 18 bytes
>       
>       switch (ctx->state)
>        {
>               case ReadSize:
>                       if (buf_len < 4)
>                               break;                  
>                       bufferevent_read(bev,size_data,4);
>                       ctx->size = get_be32(size_data);
>                       ctx->state = ReadCommand;
>               break;
>               case ReadCommand:
>                       if (buf_len<ctx->size)
>                               break;
>                       data = new uint8_t[ctx->size];
>                       bufferevent_read(bev,data,ctx->size);
>                        /// work with data
>                       delete[] data;
>               break;
>               default:
>                       //error handler
>       }
> }
> 
> Each time OnRead is called i don't know exactly how much bytes i will need to 
> read. So if understand the mechanism of libevent right OnRead should be 
> called each time there is at least one byte avaliable to read. When i try to 
> send 18 bytes OnRead callback successfully called first time and ctx->state 
> is set to ReadCommand, but callback is not calling second time, when there is 
> 14 bytes avaliable! What am i doing wrong?

Reply via email to