25#ifndef JOIN_CORE_RAW_SOCKET_HPP
26#define JOIN_CORE_RAW_SOCKET_HPP
32#include <netinet/tcp.h>
40 template <
class Protocol>
44 using Ptr = std::unique_ptr<BasicRawSocket<Protocol>>;
128 if ((this->
_state == State::Closed) && (this->
open (endpoint.protocol ()) == -1))
133 if (endpoint.protocol ().family () == AF_PACKET)
135 if (
reinterpret_cast<const struct sockaddr_ll*
> (endpoint.addr ())->sll_ifindex == 0)
137 lastError = std::make_error_code (std::errc::no_such_device);
141 else if ((endpoint.protocol ().family () == AF_INET6) || (endpoint.protocol ().family () == AF_INET))
145 else if (endpoint.protocol ().family () == AF_UNIX)
147 ::unlink (endpoint.device ().c_str ());
160 if (this->
_state == State::Closed)
166 if (this->
_state == State::Connected)
172 if ((this->
family () == AF_INET6) || (this->
family () == AF_INET))
177 int result = ::setsockopt (this->
_handle, SOL_SOCKET, SO_BINDTODEVICE, device.c_str (), device.size ());
180 lastError = std::error_code (errno, std::generic_category ());
196 if (::ioctl (this->
_handle, FIONREAD, &available) == -1)
198 lastError = std::error_code (errno, std::generic_category ());
211 ssize_t
read (
char* data,
size_t maxSize)
noexcept
215 iov.iov_len = maxSize;
217 struct msghdr message;
218 message.msg_name =
nullptr;
219 message.msg_namelen = 0;
220 message.msg_iov = &iov;
221 message.msg_iovlen = 1;
222 message.msg_control =
nullptr;
223 message.msg_controllen = 0;
225 ssize_t size = ::recvmsg (this->
_handle, &message, 0);
228 lastError = std::error_code (errno, std::generic_category ());
232 if (message.msg_flags & MSG_TRUNC)
247 ssize_t
write (
const char* data,
size_t maxSize)
noexcept
250 iov.iov_base =
const_cast<char*
> (data);
251 iov.iov_len = maxSize;
253 struct msghdr message;
254 message.msg_name =
nullptr;
255 message.msg_namelen = 0;
256 message.msg_iov = &iov;
257 message.msg_iovlen = 1;
258 message.msg_control =
nullptr;
259 message.msg_controllen = 0;
261 ssize_t result = ::sendmsg (this->
_handle, &message, 0);
264 lastError = std::error_code (errno, std::generic_category ());
279 int optlevel, optname;
284 optlevel = SOL_SOCKET;
285 optname = SO_KEEPALIVE;
289 optlevel = SOL_SOCKET;
294 optlevel = SOL_SOCKET;
299 optlevel = SOL_SOCKET;
300 optname = SO_TIMESTAMP;
304 optlevel = SOL_SOCKET;
305 optname = SO_REUSEADDR;
309 optlevel = SOL_SOCKET;
310 optname = SO_REUSEPORT;
314 optlevel = SOL_SOCKET;
315 optname = SO_BROADCAST;
319 optlevel = SOL_PACKET;
320 optname = PACKET_AUXDATA;
324 if (this->
family () == AF_INET6)
326 optlevel = IPPROTO_IPV6;
327 optname = IPV6_UNICAST_HOPS;
331 optlevel = IPPROTO_IP;
337 if (this->
family () == AF_INET6)
339 optlevel = IPPROTO_IPV6;
340 optname = IPV6_MULTICAST_LOOP;
344 optlevel = IPPROTO_IP;
345 optname = IP_MULTICAST_LOOP;
350 if (this->
family () == AF_INET6)
352 optlevel = IPPROTO_IPV6;
353 optname = IPV6_MULTICAST_HOPS;
357 optlevel = IPPROTO_IP;
358 optname = IP_MULTICAST_TTL;
363 if (this->
family () == AF_INET6)
365 optlevel = IPPROTO_IPV6;
366 optname = IPV6_MTU_DISCOVER;
370 optlevel = IPPROTO_IP;
371 optname = IP_MTU_DISCOVER;
376 if (this->
family () == AF_INET6)
378 optlevel = IPPROTO_IPV6;
379 optname = IPV6_RECVERR;
383 optlevel = IPPROTO_IP;
384 optname = IP_RECVERR;
393 int result = ::setsockopt (this->
_handle, optlevel, optname, &value,
sizeof (value));
396 lastError = std::error_code (errno, std::generic_category ());
basic raw socket class.
Definition raw_socket.hpp:42
std::unique_ptr< BasicRawSocket< Protocol > > Ptr
Definition raw_socket.hpp:44
int bindToDevice(const std::string &device) noexcept
assigns the specified device to the socket.
Definition raw_socket.hpp:158
typename BasicSocket< Protocol >::Mode Mode
Definition raw_socket.hpp:45
BasicRawSocket(const BasicRawSocket &other)=delete
copy constructor.
ssize_t write(const char *data, size_t maxSize) noexcept
write data.
Definition raw_socket.hpp:247
typename BasicSocket< Protocol >::State State
Definition raw_socket.hpp:46
Option
socket options.
Definition raw_socket.hpp:53
@ Ttl
Definition raw_socket.hpp:65
@ RcvBuffer
Definition raw_socket.hpp:60
@ MulticastTtl
Definition raw_socket.hpp:67
@ TimeStamp
Definition raw_socket.hpp:61
@ KeepIntvl
Definition raw_socket.hpp:57
@ NoDelay
Definition raw_socket.hpp:54
@ Broadcast
Definition raw_socket.hpp:64
@ SndBuffer
Definition raw_socket.hpp:59
@ PathMtuDiscover
Definition raw_socket.hpp:68
@ ReusePort
Definition raw_socket.hpp:63
@ RcvError
Definition raw_socket.hpp:69
@ ReuseAddr
Definition raw_socket.hpp:62
@ MulticastLoop
Definition raw_socket.hpp:66
@ AuxData
Definition raw_socket.hpp:70
@ KeepCount
Definition raw_socket.hpp:58
@ KeepAlive
Definition raw_socket.hpp:55
@ KeepIdle
Definition raw_socket.hpp:56
BasicRawSocket(BasicRawSocket &&other) noexcept=default
move constructor.
ssize_t canRead() const noexcept
get the number of readable bytes.
Definition raw_socket.hpp:191
BasicRawSocket & operator=(const BasicRawSocket &other)=delete
copy assignment operator.
virtual ~BasicRawSocket()=default
destroy the socket instance.
typename Protocol::Endpoint Endpoint
Definition raw_socket.hpp:47
ssize_t read(char *data, size_t maxSize) noexcept
read data.
Definition raw_socket.hpp:211
virtual int setOption(Option option, int value) noexcept
set the given option to the given value.
Definition raw_socket.hpp:277
BasicRawSocket() noexcept
default constructor.
Definition raw_socket.hpp:76
BasicRawSocket(Mode mode) noexcept
create socket instance specifying the mode.
Definition raw_socket.hpp:85
int bind(const Endpoint &endpoint) noexcept override
assigns the specified endpoint to the socket.
Definition raw_socket.hpp:126
basic socket class.
Definition socket.hpp:52
virtual int open(const Protocol &protocol=Protocol()) noexcept
open socket using the given protocol.
Definition socket.hpp:167
Mode mode() const noexcept
get the blocking mode of the socket.
Definition socket.hpp:373
State
socket states.
Definition socket.hpp:75
int family() const noexcept
get socket address family.
Definition socket.hpp:346
Mode
socket modes.
Definition socket.hpp:66
@ NonBlocking
Definition socket.hpp:68
virtual int bind(const Endpoint &endpoint) noexcept
assigns the specified endpoint to the socket.
Definition socket.hpp:217
State _state
socket state.
Definition socket.hpp:467
BasicSocket() noexcept
default constructor.
Definition socket.hpp:86
int _handle
socket handle.
Definition socket.hpp:473
Definition acceptor.hpp:32
std::error_code make_error_code(join::Errc code) noexcept
Create an std::error_code object.
Definition error.cpp:195