Notas da biblioteca Libevent (três) o processo mais básico de desenvolvimento de servidor e cliente
1. O processo mais básico de servidor TCP e desenvolvimento de cliente
1.1. Processo de programação do servidor
1. Crie event_base_new () para criar uma base de evento de objeto de contexto de estrutura
2. evconnlistener_new_bind aloca um objeto ouvinte, escuta conexões TCP em um determinado endereço e notifica você para configurar um retorno de chamada de ouvinte (a estrutura chamará quando uma nova conexão vier).
Observações: Esta função é equivalente a completar as chamadas de sistema socket (), bind (), listen () e definir a função de retorno de chamada de aceitação
(1) criar um evento de buffer de soquete por meio de um descritor de soquete existente no retorno de chamada de escuta;
(2) definir o evento de buffer Função de retorno de chamada de evento;
(3) Ativar / desativar área de buffer de gravação relacionada a bufferevent
3. Iniciar loop de envio de evento event_base_dispatch ()
4. Ler e gravar operações de acordo com a lógica de negócios bufferevent_read () / bufferevent_write ()
5. Liberar recursos relacionados quando terminar;
1.2. Processo de programação do cliente
1. Crie event_base_new () para criar a base de evento do objeto de contexto da estrutura
2. Use bufferevent socket new () para criar um evento bufferevent que se comunique com o servidor.
3. Defina a função de retorno de chamada do evento bufferevent_setcb () para o evento bufferevent. No corpo de retorno de chamada do evento
(1) determine os eventos Se o valor do evento for BEV_EVENT_CONNECTED, o processamento lógico da conexão foi bem-sucedido;
(2) Se o valor do evento for determinado como BEV_EVENT_ERROR, então ocorre o processamento lógico do erro de conexão;
4. bufferevent_socket_connect () se conecta ao servidor
(1) Se ele retornar diretamente -1, isso significa
Se ocorreu um erro, prossiga com o processamento da lógica de erro; (2) Se retornar 0, isso significa várias possibilidades. Pode ser bem-sucedido ou ainda pode estar na fase de handshake. É julgado de acordo com o retorno de chamada do evento definido.
5. Inicie o loop de despacho do evento event_base_dispatch ()
6 , Executar operações de leitura e gravação de acordo com a lógica de negócios bufferevent_read () / bufferevent_write ()
7. Liberar recursos relacionados quando terminar;
1.3. Amostra de código do lado do servidor
Consulte hello-world.c no pacote fonte oficial.
Para a versão do comentário, consulte o endereço:
notas da biblioteca Libevent (2) a versão do comentário do código de amostra hello-world
1.4. Código de amostra de programação do cliente
Observação: este código vem de artigos da web. Muitos artigos usam esse código, e eu não sei qual é o original.
#include <event2/event.h>
#include <event2/bufferevent.h>
#include <sys/socket.h>
#include <string.h>
void eventcb(struct bufferevent *bev, short events, void *ptr)
{
if (events & BEV_EVENT_CONNECTED) {
} else if (events & BEV_EVENT_ERROR) {
/* An error occured while connecting. */
}
}
int main_loop(void)
{
struct event_base *base;
struct bufferevent *bev;
struct sockaddr_in sin;
base = event_base_new();
memset(&sin, 0, sizeof(sin));
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = htonl(0x7f000001); /* 127.0.0.1 */
sin.sin_port = htons(8080); /* Port 8080 */
bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE);
bufferevent_setcb(bev, NULL, NULL, eventcb, NULL);
if (bufferevent_socket_connect(bev,
(struct sockaddr *)&sin, sizeof(sin)) < 0) {
/* Error starting connection */
bufferevent_free(bev);
return -1;
}
event_base_dispatch(base);
return 0;
}