From 3cff3744d055ae7dab86944465d269db1ba375c7 Mon Sep 17 00:00:00 2001 From: Laurent Ghigonis Date: Wed, 28 Nov 2012 01:22:41 +0100 Subject: coded gg_server_start() --- libglouglou/libglouglou.c | 114 ++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 104 insertions(+), 10 deletions(-) (limited to 'libglouglou/libglouglou.c') diff --git a/libglouglou/libglouglou.c b/libglouglou/libglouglou.c index 3882a6c..5c590ba 100644 --- a/libglouglou/libglouglou.c +++ b/libglouglou/libglouglou.c @@ -1,26 +1,66 @@ +#include +#include +#include +#include #include #include #include +#include +#include +#include +#include +#include "libglouglou.h" -struct gg_server { -}; +/* Server - private */ +void cb_receive(evutil_socket_t fd, short what, void *arg); -struct gg_packet { -}; +/* + * Server + */ /* * start a server - * totaly unblocking, using libevent */ struct gg_server * -gg_server_start(char *ip, int port, +gg_server_start(struct event_base *ev_base, char *ip, int port, int (*handle_conn)(struct gg_server *s, int client_id, struct sockaddr_in *addr), int (*handle_packet)(struct gg_server *s, struct gg_packet *p)) { - struct gg_server *s; + struct sockaddr_in sock_addr; + struct gg_server *srv; + struct event *ev; + int s; + int sock_on = 1; + + event_init(); /* XXX needed ? */ + srv = xcalloc(1, sizeof(struct gg_server)); + s = socket(AF_INET, SOCK_DGRAM, 0); + if (s < 0) + goto err; + srv->sock = s; + setsockopt(s, SOL_SOCKET, SO_REUSEADDR, + &sock_on, sizeof(sock_on)); + memset(&sock_addr, 0, sizeof(sock_addr)); + sock_addr.sin_family = AF_INET; + sock_addr.sin_addr.s_addr = htonl(INADDR_ANY); /* XXX use ip */ + sock_addr.sin_port = htons(port); + if (bind(s, (struct sockaddr *)&sock_addr, + sizeof(sock_addr)) != 0) + goto err; + fd_nonblock(s); - return s; + ev = event_new(ev_base, s, EV_READ|EV_PERSIST, cb_receive, srv); + event_add(ev, NULL); + srv->ev = ev; + + return srv; + +err: + printf("libglouglou: gg_server_start: Error ! %s", + strerror(errno)); + gg_server_stop(srv); + return NULL; } int @@ -30,14 +70,30 @@ gg_server_send(struct gg_server *s, int client_id, struct gg_packet *p) } void -gg_server_stop(struct gg_server *s) +gg_server_stop(struct gg_server *srv) { + if (srv->ev) + event_del(srv->ev); + if (srv->sock) + close(srv->sock); + free(srv); +} +/* + * Server - private + */ + +void cb_receive(evutil_socket_t fd, short what, void *arg) +{ + printf("Incoming data !\n"); } +/* + * Client + */ + /* * connect to a server - * totaly unblocking, using libevent */ struct gg_client * gg_client_connect(char *ip, int port, @@ -46,6 +102,8 @@ gg_client_connect(char *ip, int port, { struct gg_client *c; + c = xmalloc(sizeof(struct gg_client)); + return c; } @@ -58,5 +116,41 @@ gg_client_send(struct gg_client *c, struct gg_packet *p) void gg_client_disconnect(struct gg_client *c) { + free(c); +} +/* + * Utils + */ + +void * +xmalloc(size_t size) +{ + void *data; + + data = malloc(size); + if (!data) + err(1, "could not malloc %d", (int)size); + return data; +} + +void * +xcalloc(size_t nmemb, size_t size) +{ + void *data; + + data = calloc(nmemb, size); + if (!data) + err(1, "could not calloc %d", (int)size); + return data; } + +void +fd_nonblock(int fd) +{ + int flags = fcntl(fd, F_GETFL, 0); + int rc = fcntl(fd, F_SETFL, flags | O_NONBLOCK); + if (rc == -1) + printf("failed to set fd %i non-blocking", fd); +} + -- cgit v1.2.3-59-g8ed1b