- 论坛徽章:
- 0
|
各位大侠,小弟现在在做一个类似于echo的server,但是用的是公司制定的协议,对于这样的情况大家是怎么样用Libevent来处理的- void buffered_on_read(struct bufferevent *bev, void *arg)
- {
- struct client *this_client = (struct client *) arg;
- struct evbuffer_ptr start;
- int msg_len;
- uint8_t *head;
- uint8_t *message;
- /* Copy as many data as possible */
- struct evbuffer *input = bufferevent_get_input(this_client->buf_ev);
- if (evbuffer_get_length(input) >= 11)
- {
- evbuffer_remove_buffer(input, g_data, BUFFER_LENGTH);
- for ( ; ; ) {
- start = evbuffer_search(g_data, (char *)TAG, 3, NULL);
- if (start.pos == -1) {
- /* FCFCFC not found! */
- break;
- }
- else if (start.pos != 0) {
- /* Garbage message, remove it! */
- evbuffer_drain(g_data, start.pos);
- continue;
- }
- else {
- /* Find right message */
- if (evbuffer_get_length(g_data) > 11) {
- head = evbuffer_pullup(g_data, 11);
- msg_len = head[10] & 0xFF;
- msg_len |= (head[9] << 8) & 0xFF00;
- if (evbuffer_get_length(g_data) >= (msg_len + 11)) {
- message = evbuffer_pullup(g_data, msg_len + 11);
-
- /* Handle message at here */
- handle_raw_message(this_client, message, msg_len + 11);
- /* After handle, remove it */
- evbuffer_drain(g_data, msg_len + 11);
- }
- else {
- /* Message length smaller than (msg_len+11) */
- break;
- }
- }
- else
- {
- /* Message length smaller or equal than 11 */
- break;
- }
- continue;
- }
- }
- }
- /* Add remain message to struct evbuffer input again */
- evbuffer_prepend_buffer(input, g_data);
- return;
- }
复制代码 |
|