-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathSocketDatagrama.cpp
More file actions
94 lines (88 loc) · 2.82 KB
/
SocketDatagrama.cpp
File metadata and controls
94 lines (88 loc) · 2.82 KB
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
#include "SocketDatagram.h"
#include "PaqueteDatagrama.h"
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <netinet/in.h>
#include <netdb.h>
#include <strings.h>
#include <unistd.h>
#include <iostream>
#include <cstring>
#include <errno.h>
using namespace std;
SocketDatagrama::SocketDatagrama(int puerto)
{
s = socket(AF_INET, SOCK_DGRAM, 0);
/* rellena la dirección local */
bzero((char *)&direccionLocal, sizeof(direccionLocal));
direccionLocal.sin_family = AF_INET;
direccionLocal.sin_addr.s_addr = INADDR_ANY;
direccionLocal.sin_port = htons(puerto);
bind(s, (struct sockaddr *)&direccionLocal, sizeof(direccionLocal));
/* rellena la dirección foranea */
bzero((char *)&direccionForanea, sizeof(direccionForanea));
}
SocketDatagrama::~SocketDatagrama()
{
close(s);
}
//Recibe un paquete tipo datagrama proveniente de este socket
int SocketDatagrama::recibe(PaqueteDatagrama & p)
{
unsigned char inet[4];
unsigned int clen=sizeof(direccionForanea);
int res= recvfrom(s, (char *)p.obtieneDatos(),p.obtieneLongitud(), 0,(struct sockaddr *)&direccionForanea,&clen);
// COPIAR A INET
memcpy(inet, &direccionForanea.sin_addr.s_addr, 4);
//printf("IP: ");
//for(int i = 0; i < 4; i++) {
//printf("%d ", inet[i]);
//}
//printf("\n");
p.inicializaIp((char*)inet);
//printf("PUERTO: %d \n", ntohs(direccionForanea.sin_port));
p.inicializaPuerto(ntohs(direccionForanea.sin_port));
return res;
}
//Envía un paquete tipo datagrama desde este socket
int SocketDatagrama::envia(PaqueteDatagrama & p)
{
direccionForanea.sin_family = AF_INET;
direccionForanea.sin_addr.s_addr = inet_addr(p.obtieneDireccion());
direccionForanea.sin_port = htons(p.obtienePuerto());
return sendto(s, (char *)p.obtieneDatos(),p.obtieneLongitud(), 0, (struct sockaddr *) &direccionForanea, sizeof(direccionForanea));
}
int SocketDatagrama::recibeTimeout(PaqueteDatagrama & p, time_t segundos, suseconds_t microsegundos)
{
unsigned char inet[4];
unsigned int clen=sizeof(direccionForanea);
//contador
timeout.tv_sec=segundos;
timeout.tv_usec=microsegundos;
setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, (char *)&timeout, sizeof(timeout));
int res;
res= recvfrom(s, (char *)p.obtieneDatos(),p.obtieneLongitud(), 0,(struct sockaddr *)&direccionForanea,&clen);
if (res < 0)
{
if (errno == EWOULDBLOCK)
{
printf("Tiempo para recepción transcurrido\n");
res=-1;
}
else
printf("Error en recvfrom\n");
}
// COPIAR A INET
memcpy(inet, &direccionForanea.sin_addr.s_addr, 4);
//printf("IP: ");
//for(int i = 0; i < 4; i++) {
// printf("%d ", inet[i]);
//}
//printf("\n");
p.inicializaIp((char*)inet);
//printf("PUERTO: %d \n", ntohs(direccionForanea.sin_port));
p.inicializaPuerto(ntohs(direccionForanea.sin_port));
return res;
}