-
Notifications
You must be signed in to change notification settings - Fork 0
/
socket.cc
67 lines (48 loc) · 1.97 KB
/
socket.cc
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
/* Univerdidad:Universidad de La Laguna.
Grado: Grado de ingeniería informática.
Asignatura: Asignatura Sistemas Operativos (SSOO).
Autor: Alejandro Lugo Fumero.
Correo: [email protected]
Práctica nº: 2
Comentario: Este programa mediante un socket envía la información de un .txt
a otro socket guardando el mensaje en otro .txt.
Compilar: g++ -g -pthread -o Netcp file.cc netcp.cc socket.cc
Ejecutar: ./Netcp 'port' 'ip_address'
*/
#include "socket.h"
Socket::Socket(const sockaddr_in& address) {
// Creamos el socket.
fd_ = socket(AF_INET, SOCK_DGRAM, 0);
if (fd_ < 0)
throw std::system_error(errno, std::system_category(), "No se pudo "
"crear el socket");
// Le asignamos una dirección al socket.
int result = bind (fd_, reinterpret_cast<const sockaddr*>(&address),
sizeof(address));
if (result < 0) {
throw std::system_error(errno, std::system_category(), "No se pudo "
"asignar una dirección al socket 'error bind()'");
}
}
Socket::~Socket() {
close(fd_);
}
void
Socket::SendTo(const Message& message, const sockaddr_in& address) {
// Utilizamos sendto para enviar un mensaje al otro socket.
int result = sendto(fd_, &message, sizeof(message), 0,
reinterpret_cast<const sockaddr*>(&address), sizeof(address));
if (result < 0)
throw std::system_error(errno, std::system_category(), "Falló sendto");
}
void
Socket::ReceiveFrom(Message& message, sockaddr_in& address) {
socklen_t src_len = sizeof(address);
// Utilizamos recvfrom para recibir un mensaje de otro socket.
if (recvfrom(fd_, &message, sizeof(message), 0,
reinterpret_cast<sockaddr*>(&address), &src_len) < 0)
throw std::system_error(errno, std::system_category(), "Falló recvfrom");
message.text[1023] = '\0';
message.remote_ip = inet_netof(address.sin_addr);
message.remote_port = ntohs(address.sin_port);
}