Browse Source

Servidor de mensagem KDect

master
bruno 1 year ago
commit
959ef0f953
  1. 5
      .gitignore
  2. 24
      Makefile
  3. 0
      obj/delete-me
  4. 29
      src/fp.c
  5. 0
      src/http.c
  6. 16
      src/main.c
  7. 64
      src/main.h
  8. 86
      src/net.c

5
.gitignore vendored

@ -0,0 +1,5 @@
a.out
kdect_ms
obj/*.o

24
Makefile

@ -0,0 +1,24 @@
CC=gcc
DIR_OBJ=obj/
DIR_SRC=src/
CFLAGS= -Wall
LIBS= -levent
OBJ = \
obj/main.o \
obj/http.o \
obj/fp.o \
obj/net.o
kdect_ms: $(OBJ)
$(CC) -o $@ $^ $(LIBS)
$(DIR_OBJ)%.o: $(DIR_SRC)%.c
$(CC) -c -o $@ $< $(CFLAGS)
clean:
rm $(DIR_OBJ)*.o

0
obj/delete-me

29
src/fp.c

@ -0,0 +1,29 @@
#include "main.h"
struct s_kdect_fp *get_kdect_fp_bev( struct s_kdect_fp **kdect_fp, struct bufferevent *bev ){
}
int remove_kdect_fp_bev(struct s_kdect_fp **kdect_fp, struct bufferevent *bev){
}
int add_kdect_fp(struct s_kdect_fp **kdect_fp, struct s_kdect_fp *next){
}
void free_kdect_fp( struct s_kdect_fp **kdect_fp ){
}
void free_handset( struct s_kdect_handset **handset ){
}

0
src/http.c

16
src/main.c

@ -0,0 +1,16 @@
#include "main.h"
int main(int argc, char **argv){
signal( SIGPIPE, SIG_IGN );
struct s_kdect_ms *message_server;
message_server = (struct s_kdect_ms *) calloc(1, sizeof(struct s_kdect_ms));
init_net_server( message_server );
return 0;
}

64
src/main.h

@ -0,0 +1,64 @@
#ifndef MAIN_H
#define MAIN_H
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <signal.h>
#include <stdlib.h>
#include <string.h>
#include <event.h>
#include <event2/listener.h>
#include <event2/bufferevent_ssl.h>
struct s_net_server {
char ip[16];
unsigned short int port;
struct sockaddr_in sock_addr;
struct evconnlistener *listener;
struct event_base *evbase;
};
struct s_net_fp {
char ip[16];
unsigned short int port;
struct sockaddr_in sock_addr;
struct event_base *evbase;
struct bufferevent *bev;
};
/* estação base */
struct s_kdect_fp {
struct s_net_fp net;
struct s_kdect_handset *handset;
struct s_fp *next;
};
/* telefones */
struct s_kdect_handset {
char *name;
unsigned short int status;
unsigned int timestamp;
struct s_handset *next;
};
struct s_kdect_ms {
struct s_net_server net;
struct s_kdect_fp *kdect_fp;
};
void accept_in(struct evconnlistener *listener, int sock, struct sockaddr *sa, int sa_len, void *arg);
int init_net_server( struct s_kdect_ms *message_server);
int add_kdect_fp(struct s_kdect_fp **kdect_fp, struct s_kdect_fp *);
void free_kdect_fp( struct s_kdect_fp **kdect_fp );
struct s_kdect_fp *get_kdect_fp_bev( struct s_kdect_fp **kdect_fp, struct bufferevent *bev );
void free_handset( struct s_kdect_handset **handset );
int remove_kdect_fp_bev(struct s_kdect_fp **kdect_fp, struct bufferevent *bev);
#endif

86
src/net.c

@ -0,0 +1,86 @@
#include "main.h"
void read_in (struct bufferevent *bev, void *arg){
struct s_kdect_ms *message_server = (struct s_kdect_ms *) arg;
}
void descriptor_in(struct bufferevent *bev, short error, void *param){
struct s_kdect_ms *message_server = (struct s_kdect_ms *) param;
if(error & BEV_EVENT_CONNECTED){ /* SSL conectado */
return;
}
else if (error & (BEV_EVENT_ERROR|BEV_EVENT_EOF)){
struct s_kdect_fp *kdect_fp = get_kdect_fp_bev(&message_server->kdect_fp, bev);
if(kdect_fp){
//conclude_kdect_fp(client); unlock thread
remove_kdect_fp_bev(&message_server->kdect_fp, bev);
}
}
else {
struct s_kdect_fp *kdect_fp = get_kdect_fp_bev(&message_server->kdect_fp, bev);
if(kdect_fp){
//conclude_kdect_fp(client); unlock thread
remove_kdect_fp_bev(&message_server->kdect_fp, bev);
}
}
}
void accept_in(struct evconnlistener *listener, int sock, struct sockaddr *sa, int sa_len, void *arg){
struct s_kdect_ms *message_server = (struct s_kdect_ms *) arg;
struct s_kdect_fp *kdect_fp = NULL;
kdect_fp = calloc(1, sizeof(struct s_net_fp));
if( !kdect_fp ){
exit(-1);
}
kdect_fp->net.evbase = evconnlistener_get_base(message_server->net.listener);
kdect_fp->net.bev = bufferevent_socket_new(kdect_fp->net.evbase, sock, BEV_OPT_CLOSE_ON_FREE);
if(!kdect_fp->net.bev){
free_kdect_fp(&kdect_fp);
return;
}
bufferevent_set_max_single_read(kdect_fp->net.bev, EV_SSIZE_MAX);
add_kdect_fp(&message_server->kdect_fp, kdect_fp);
bufferevent_setcb(kdect_fp->net.bev, read_in, NULL, descriptor_in, (void *)message_server);
bufferevent_setwatermark(kdect_fp->net.bev, EV_READ, 0, 0);
bufferevent_enable(kdect_fp->net.bev, EV_READ);
}
int init_net_server( struct s_kdect_ms *message_server){
memset( &message_server->net.sock_addr, 0, sizeof(message_server->net.sock_addr));
message_server->net.sock_addr.sin_family = AF_INET;
message_server->net.sock_addr.sin_port = htons(20000);
message_server->net.sock_addr.sin_addr.s_addr = INADDR_ANY;
message_server->net.evbase = event_base_new();
if( !message_server->net.evbase ){
exit(-1);
}
message_server->net.listener = evconnlistener_new_bind(
message_server->net.evbase, accept_in, (void *)message_server,
LEV_OPT_CLOSE_ON_FREE | LEV_OPT_REUSEABLE, 10,
(struct sockaddr *)&(message_server->net.sock_addr), sizeof( message_server->net.sock_addr ));
event_base_loop( message_server->net.evbase, EVLOOP_NO_EXIT_ON_EMPTY );
}
Loading…
Cancel
Save