io
C++ I/O scheduling library with asynchronous socket operations
Loading...
Searching...
No Matches
socket.cpp
1/* Copyright 2025 Kevin Exton
2 *
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16#include "socket.hpp"
17
18namespace io::socket {
19
20auto tag_invoke([[maybe_unused]] bind_t tag, const socket_handle &socket,
21 const sockaddr_type *addr, socklen_type len) -> int {
22 return ::bind(static_cast<native_socket_type>(socket), addr, len);
23}
24
25auto tag_invoke([[maybe_unused]] bind_t tag, const socket_handle &socket,
26 const socket_address &addr) -> int {
27 return ::bind(static_cast<native_socket_type>(socket), addr.data(),
28 *addr.size());
29}
30
31auto tag_invoke([[maybe_unused]] listen_t tag, const socket_handle &socket,
32 int backlog) -> int {
33 return ::listen(static_cast<native_socket_type>(socket), backlog);
34}
35
36auto tag_invoke([[maybe_unused]] connect_t tag, const socket_handle &socket,
37 const sockaddr_type *addr, socklen_type len) -> int {
38 return ::connect(static_cast<native_socket_type>(socket), addr, len);
39}
40
41auto tag_invoke([[maybe_unused]] connect_t tag, const socket_handle &socket,
42 const socket_address &addr) -> int {
43 return ::connect(static_cast<native_socket_type>(socket), addr.data(),
44 *addr.size());
45}
46
47auto tag_invoke([[maybe_unused]] accept_t tag, const socket_handle &socket,
49 return ::accept(static_cast<native_socket_type>(socket), addr, len);
50}
51
52auto tag_invoke([[maybe_unused]] accept_t tag, const socket_handle &socket,
53 socket_address addr)
54 -> std::tuple<socket_handle, socket_address> {
55 socket_handle handle{::accept(static_cast<native_socket_type>(socket),
56 addr.data(), addr.size())};
57 return std::make_tuple(std::move(handle), addr);
58}
59
60auto tag_invoke([[maybe_unused]] sendmsg_t tag, const socket_handle &socket,
61 const socket_message_type *msg, int flags) -> std::streamsize {
62 return ::io::socket::sendmsg(static_cast<native_socket_type>(socket), msg,
63 flags);
64}
65
66// TODO: This needs to be made portable for both POSIX and Windows.
67auto tag_invoke([[maybe_unused]] sendmsg_t tag, const socket_handle &socket,
68 const socket_message &msg) -> std::streamsize {
69
70 auto [address, buffers, control, flags] = msg.get();
71
72 std::vector<struct iovec> iov;
73 for (const auto &buffer : buffers)
74 iov.emplace_back(buffer.data(), buffer.size());
75
77 address.data(), *address.size(), iov.data(), iov.size(),
78 control.data(), control.size(), 0};
79
80 return ::io::socket::sendmsg(static_cast<native_socket_type>(socket), &msghdr,
81 flags);
82}
83
84auto tag_invoke([[maybe_unused]] recvmsg_t tag, const socket_handle &socket,
85 socket_message_type *msg, int flags) -> std::streamsize {
86 return ::io::socket::recvmsg(static_cast<native_socket_type>(socket), msg,
87 flags);
88}
89
90auto tag_invoke([[maybe_unused]] getsockopt_t tag, const socket_handle &socket,
91 int level, int optname, void *optval,
92 socklen_type *optlen) -> int {
93 return ::getsockopt(static_cast<native_socket_type>(socket), level, optname,
94 optval, optlen);
95}
96
97auto tag_invoke([[maybe_unused]] setsockopt_t tag, const socket_handle &socket,
98 int level, int optname, const void *optval,
99 socklen_type optlen) -> int {
100 return ::setsockopt(static_cast<native_socket_type>(socket), level, optname,
101 optval, optlen);
102}
103
104auto tag_invoke([[maybe_unused]] getsockname_t tag, const socket_handle &socket,
105 sockaddr_type *addr, socklen_type *len) -> int {
106 return ::getsockname(static_cast<native_socket_type>(socket), addr, len);
107}
108
109auto tag_invoke([[maybe_unused]] getpeername_t tag, const socket_handle &socket,
110 sockaddr_type *addr, socklen_type *len) -> int {
111 return ::getpeername(static_cast<native_socket_type>(socket), addr, len);
112}
113
114auto tag_invoke([[maybe_unused]] shutdown_t tag, const socket_handle &socket,
115 int how) -> int {
116 return ::shutdown(static_cast<native_socket_type>(socket), how);
117}
118
119} // namespace io::socket
A platform-independent representation of a socket address.
A thread-safe, move-only RAII wrapper for a native socket handle.
A thread-safe container for socket messages used in advanced I/O operations.
The io::socket namespace provides a cross-platform abstraction for socket-level I/O operations.
Definition socket.hpp:31
msghdr socket_message_type
The socket message type for POSIX systems.
Definition socket.hpp:64
sockaddr sockaddr_type
The generic socket address structure for POSIX systems.
Definition socket.hpp:137
int native_socket_type
The native socket handle type for POSIX systems.
Definition socket.hpp:38
auto tag_invoke(bind_t tag, const socket_handle &socket, const sockaddr_type *addr, socklen_type len) -> int
Binds a socket to a local address.
Definition socket.cpp:20
socklen_t socklen_type
The type used to represent socket-related sizes on POSIX systems.
Definition socket.hpp:155
constexpr detail::cpo< socket::accept_t > accept
A customization point object that accepts an incoming connection on a listening socket.
Definition io.hpp:45
This file defines the core socket operations for the I/O library.
A tag type for the io::accept customization point object (CPO).
A tag type for the io::bind customization point object (CPO).
A tag type for the io::connect customization point object (CPO).
A tag type for the io::getpeername customization point object (CPO).
A tag type for the io::getsockname customization point object (CPO).
A tag type for the io::getsockopt customization point object (CPO).
A tag type for the io::listen customization point object (CPO).
A tag type for the io::recvmsg customization point object (CPO).
A tag type for the io::sendmsg customization point object (CPO).
A tag type for the io::setsockopt customization point object (CPO).
A tag type for the io::shutdown customization point object (CPO).