1 // ANNA - Anna is Not Nothingness Anymore //
3 // (c) Copyright 2005-2015 Eduardo Ramos Testillano & Francisco Ruiz Rayo //
5 // See project site at http://redmine.teslayout.com/projects/anna-suite //
6 // See accompanying file LICENSE or copy at http://www.teslayout.com/projects/public/anna.LICENSE //
10 #include <sys/socket.h>
13 #include <anna/core/tracing/Logger.hpp>
14 #include <anna/core/DataBlock.hpp>
15 #include <anna/config/defines.hpp>
16 #include <anna/core/functions.hpp>
18 #include <anna/comm/DatagramSocket.hpp>
23 comm::DatagramSocket::DatagramSocket(const comm::DatagramSocket::Mode mode, const comm::INetAddress& address, comm::TransportFactory* transportFactory) :
24 comm::ClientSocket(transportFactory, comm::Socket::Domain::Inet, comm::Socket::Type::Datagram),
27 a_localAccessPoint = address;
29 a_remoteAccessPoint = address;
32 void comm::DatagramSocket::connect()
33 throw(RuntimeException) {
34 Guard guard(*this, "comm::DatagramSocket::connect");
35 anna_socket_assert(isConnected() == true, "Already connected");
37 if (Socket::isOpened() == false) {
40 setBlockingMode(false);
43 // Hace el bind a la localAddress.
44 if (a_mode == ReadOnly && Socket::isBound() == false)
47 activate(Status::Connected);
49 string msg("comm::DatagramSocket::connect | ");
51 Logger::debug(msg, ANNA_FILE_LOCATION);
55 void comm::DatagramSocket::do_write(const DataBlock& message)
56 throw(RuntimeException) {
59 a_remoteAccessPoint.translate(*this, s, len);
61 anna_signal_shield(r, sendto(Socket::a_fd, message.getData(), message.getSize(), 0, s, len));
64 const int xerrno = errno;
65 string msg(asString());
66 msg += " | Cannot be sent";
67 throw RuntimeException(msg, xerrno, ANNA_FILE_LOCATION);
71 string msg("comm::DatagramSocket::do_write | ");
73 msg += functions::asText(" | Sent: ", message);
74 Logger::write(Logger::Debug, msg, ANNA_FILE_LOCATION)
78 int comm::DatagramSocket::do_read(const char* data, const int maxSize)
79 throw(RuntimeException) {
81 anna_signal_shield(result, recvfrom(Socket::a_fd, (void*) data, maxSize, 0, (sockaddr*) NULL, NULL));
84 const int xerrno = errno;
85 string msg(asString());
86 msg += " | Cannot be received";
87 throw RuntimeException(msg, xerrno, ANNA_FILE_LOCATION);
91 string msg("comm::DatagramSocket::do_read | ");
93 msg += functions::asText(" | N-bytes", result);
94 msg += functions::asText(" | Received: ", DataBlock(data, result, false));
95 Logger::write(Logger::Debug, msg, ANNA_FILE_LOCATION)