-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.c
123 lines (92 loc) · 2.96 KB
/
utils.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include "utils.h"
void* serializar_paquete(t_paquete* paquete, int bytes)
{
void * magic = malloc(bytes);
int desplazamiento = 0;
memcpy(magic + desplazamiento, &(paquete->codigo_operacion), sizeof(int));
desplazamiento+= sizeof(int);
memcpy(magic + desplazamiento, &(paquete->buffer->size), sizeof(int));
desplazamiento+= sizeof(int);
memcpy(magic + desplazamiento, paquete->buffer->stream, paquete->buffer->size);
desplazamiento+= paquete->buffer->size;
return magic;
}
int crear_conexion(char *ip, char* puerto)
{
struct addrinfo hints;
struct addrinfo *server_info;
memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_flags = AI_PASSIVE;
getaddrinfo(ip, puerto, &hints, &server_info);
// Ahora vamos a crear el socket.
int socket_cliente = 0;
socket_cliente = socket(server_info->ai_family,
server_info->ai_socktype,
server_info->ai_protocol);
// Ahora que tenemos el socket, vamos a conectarlo
connect(socket_cliente,server_info->ai_addr,server_info->ai_addrlen);
freeaddrinfo(server_info);
return socket_cliente;
}
void enviar_mensaje(char* mensaje, int socket_cliente)
{
t_paquete* paquete = malloc(sizeof(t_paquete));
paquete->codigo_operacion = MENSAJE;
paquete->buffer = malloc(sizeof(t_buffer));
paquete->buffer->size = strlen(mensaje) + 1;
paquete->buffer->stream = malloc(paquete->buffer->size);
memcpy(paquete->buffer->stream, mensaje, paquete->buffer->size);
int bytes = paquete->buffer->size + 2*sizeof(int);
void* a_enviar = serializar_paquete(paquete, bytes);
send(socket_cliente, a_enviar, bytes, 0);
free(a_enviar);
eliminar_paquete(paquete);
}
void crear_buffer(t_paquete* paquete)
{
paquete->buffer = malloc(sizeof(t_buffer));
paquete->buffer->size = 0;
paquete->buffer->stream = NULL;
}
t_paquete* crear_super_paquete(void)
{
//me falta un malloc!
t_paquete* paquete;
//descomentar despues de arreglar
//paquete->codigo_operacion = PAQUETE;
//crear_buffer(paquete);
return paquete;
}
t_paquete* crear_paquete(void)
{
t_paquete* paquete = malloc(sizeof(t_paquete));
paquete->codigo_operacion = PAQUETE;
crear_buffer(paquete);
return paquete;
}
void agregar_a_paquete(t_paquete* paquete, void* valor, int tamanio)
{
paquete->buffer->stream = realloc(paquete->buffer->stream, paquete->buffer->size + tamanio + sizeof(int));
memcpy(paquete->buffer->stream + paquete->buffer->size, &tamanio, sizeof(int));
memcpy(paquete->buffer->stream + paquete->buffer->size + sizeof(int), valor, tamanio);
paquete->buffer->size += tamanio + sizeof(int);
}
void enviar_paquete(t_paquete* paquete, int socket_cliente)
{
int bytes = paquete->buffer->size + 2*sizeof(int);
void* a_enviar = serializar_paquete(paquete, bytes);
send(socket_cliente, a_enviar, bytes, 0);
free(a_enviar);
}
void eliminar_paquete(t_paquete* paquete)
{
free(paquete->buffer->stream);
free(paquete->buffer);
free(paquete);
}
void liberar_conexion(int socket_cliente)
{
close(socket_cliente);
}