Commit 605691fc authored by Jakob Otto's avatar Jakob Otto

Cleanup

parent 1dc3622d
...@@ -25,7 +25,7 @@ ...@@ -25,7 +25,7 @@
namespace caf { namespace caf {
namespace net { namespace net {
/// A non connection-oriented network communication endpoint for bidirectional /// A datagram-oriented network communication endpoint for bidirectional
/// byte transmission. /// byte transmission.
struct udp_datagram_socket : abstract_socket<udp_datagram_socket> { struct udp_datagram_socket : abstract_socket<udp_datagram_socket> {
using super = abstract_socket<udp_datagram_socket>; using super = abstract_socket<udp_datagram_socket>;
...@@ -41,11 +41,13 @@ struct udp_datagram_socket : abstract_socket<udp_datagram_socket> { ...@@ -41,11 +41,13 @@ struct udp_datagram_socket : abstract_socket<udp_datagram_socket> {
} }
}; };
/// Creates a `tcp_stream_socket` connected to given remote node. /// Creates a `udp_datagram_socket` bound to given port.
/// @param node Host and port of the remote node. /// @param node ip_endpoint that contains the port to bind to. Pass port '0' to
/// bind to any unused port - The endpoint will be updated with the specific
/// port that was bound.
/// @returns The connected socket or an error. /// @returns The connected socket or an error.
/// @relates tcp_stream_socket /// @relates udp_datagram_socket
expected<udp_datagram_socket> make_udp_datagram_socket(ip_endpoint& node, expected<udp_datagram_socket> make_udp_datagram_socket(ip_endpoint& ep,
bool reuse_addr = false); bool reuse_addr = false);
/// Enables or disables `SIO_UDP_CONNRESET` error on `x`. /// Enables or disables `SIO_UDP_CONNRESET` error on `x`.
...@@ -63,7 +65,7 @@ error allow_connreset(udp_datagram_socket x, bool new_value); ...@@ -63,7 +65,7 @@ error allow_connreset(udp_datagram_socket x, bool new_value);
variant<std::pair<size_t, ip_endpoint>, sec> read(udp_datagram_socket x, variant<std::pair<size_t, ip_endpoint>, sec> read(udp_datagram_socket x,
span<byte> buf); span<byte> buf);
/// Transmits data from `x` to its peer. /// Transmits data from `x` to given eendpoint.
/// @param x udp_datagram_socket. /// @param x udp_datagram_socket.
/// @param buf Points to the message to send. /// @param buf Points to the message to send.
/// @returns The number of written bytes on success, otherwise an error code. /// @returns The number of written bytes on success, otherwise an error code.
......
...@@ -55,27 +55,33 @@ error allow_connreset(udp_datagram_socket x, bool) { ...@@ -55,27 +55,33 @@ error allow_connreset(udp_datagram_socket x, bool) {
#endif // CAF_WINDOWS #endif // CAF_WINDOWS
expected<udp_datagram_socket> make_udp_datagram_socket(ip_endpoint& node, expected<udp_datagram_socket> make_udp_datagram_socket(ip_endpoint& ep,
bool reuse_addr) { bool reuse_addr) {
CAF_LOG_TRACE(CAF_ARG(node)); CAF_LOG_TRACE(CAF_ARG(ep));
auto addr = to_sockaddr(node); auto addr = to_sockaddr(ep);
CAF_NET_SYSCALL("socket", fd, ==, invalid_socket_id, CAF_NET_SYSCALL("socket", fd, ==, invalid_socket_id,
::socket(addr.ss_family, SOCK_DGRAM, 0)); ::socket(addr.ss_family, SOCK_DGRAM, 0));
udp_datagram_socket sock{fd}; udp_datagram_socket sock{fd};
auto sguard = make_socket_guard(sock); auto sguard = make_socket_guard(sock);
socklen_t len = (addr.ss_family == AF_INET) ? sizeof(sockaddr_in) socklen_t len = (addr.ss_family == AF_INET) ? sizeof(sockaddr_in)
: sizeof(sockaddr_in6); : sizeof(sockaddr_in6);
if (reuse_addr) {
int on = 1;
CAF_NET_SYSCALL("setsockopt", tmp1, !=, 0,
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR,
reinterpret_cast<setsockopt_ptr>(&on),
static_cast<socket_size_type>(sizeof(on))));
}
CAF_NET_SYSCALL("bind", err, !=, 0, CAF_NET_SYSCALL("bind", err, !=, 0,
::bind(sock.id, reinterpret_cast<sockaddr*>(&addr), len)); ::bind(sock.id, reinterpret_cast<sockaddr*>(&addr), len));
CAF_NET_SYSCALL("getsockname", erro, !=, 0, CAF_NET_SYSCALL("getsockname", erro, !=, 0,
getsockname(sock.id, reinterpret_cast<sockaddr*>(&addr), getsockname(sock.id, reinterpret_cast<sockaddr*>(&addr),
&len)); &len));
CAF_LOG_DEBUG(CAF_ARG(sock.id)); CAF_LOG_DEBUG(CAF_ARG(sock.id));
auto port = addr.ss_family == AF_INET auto port = addr.ss_family == AF_INET
? reinterpret_cast<sockaddr_in*>(&addr)->sin_port ? reinterpret_cast<sockaddr_in*>(&addr)->sin_port
: reinterpret_cast<sockaddr_in6*>(&addr)->sin6_port; : reinterpret_cast<sockaddr_in6*>(&addr)->sin6_port;
node.port(ntohs(port)); ep.port(ntohs(port));
return sguard.release(); return sguard.release();
} }
......
...@@ -43,6 +43,7 @@ struct fixture : host_fixture { ...@@ -43,6 +43,7 @@ struct fixture : host_fixture {
: host_fixture(), : host_fixture(),
v4_local{make_ipv4_address(127, 0, 0, 1)}, v4_local{make_ipv4_address(127, 0, 0, 1)},
v6_local{{0}, {0x1}}, v6_local{{0}, {0x1}},
// TODO: use local_addresses() when merged
addrs{net::ip::resolve("localhost")} { addrs{net::ip::resolve("localhost")} {
} }
...@@ -94,6 +95,8 @@ struct fixture : host_fixture { ...@@ -94,6 +95,8 @@ struct fixture : host_fixture {
CAF_TEST_FIXTURE_SCOPE(udp_datagram_socket_test, fixture) CAF_TEST_FIXTURE_SCOPE(udp_datagram_socket_test, fixture)
CAF_TEST(send and receive) { CAF_TEST(send and receive) {
// TODO: check which versions exist and test existing versions accordingly
// -> local_addresses()
if (contains(v4_local)) { if (contains(v4_local)) {
test_send_receive(v4_local); test_send_receive(v4_local);
} else if (contains(v6_local)) { } else if (contains(v6_local)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment