27 UdpIPv4Client(std::string ip,
int port) : ip_(std::move(ip)), port_(port) {
29 int startup_result = WSAStartup(MAKEWORD(2, 2), &wsa_data_);
32 ss <<
"Cannot start WinSock (error: " << startup_result <<
")";
33 throw std::runtime_error(ss.str());
37 fd_ = socket(AF_INET, SOCK_DGRAM, 0);
39 if (fd_ == INVALID_SOCKET) {
44 throw std::runtime_error(
"Create udp socket failed");
50 if (inet_pton(AF_INET, ip_.c_str(), &
server_addr_.sin_addr) <= 0) {
57 throw std::runtime_error(
"Invalid IPv4 address / Address not supported");
63 if (ioctlsocket(fd_, FIONBIO, &mode) != NO_ERROR) {
64 shutdown(fd_, SD_BOTH);
68 if (fcntl(fd_, F_SETFL, fcntl(fd_, F_GETFL) | O_NONBLOCK) < 0) {
69 shutdown(fd_, SHUT_RDWR);
72 throw std::runtime_error(
"failed to pu the socket in non-blocking mode");
78 shutdown(fd_, SD_BOTH);
82 shutdown(fd_, SHUT_RDWR);
87 int RecvFrom(
unsigned char* buffer,
size_t max_buf_size)
const override {
88 struct sockaddr_in server_addr {};
90 socklen_t addr_len =
sizeof(server_addr);
91 return (
int)recvfrom(fd_, buffer, max_buf_size, 0, (
struct sockaddr*)&server_addr, &addr_len);
94 void SendTo(
unsigned char* buffer,
size_t buf_size)
const override {
114 UdpIPv6Client(std::string ip,
int port) : ip_(std::move(ip)), port_(port) {
116 int startup_result = WSAStartup(MAKEWORD(2, 2), &wsa_data_);
117 if (startup_result) {
118 std::stringstream ss;
119 ss <<
"Cannot start WinSock (error: " << startup_result <<
")";
120 throw std::runtime_error(ss.str());
124 fd_ = socket(AF_INET6, SOCK_DGRAM, 0);
126 if (fd_ == INVALID_SOCKET) {
131 throw std::runtime_error(
"Create udp socket failed");
137 if (inet_pton(AF_INET6, ip_.c_str(), &
server_addr_.sin6_addr) <= 0) {
144 throw std::runtime_error(
"Invalid IPv6 address / Address not supported");
150 if (ioctlsocket(fd_, FIONBIO, &mode) != NO_ERROR) {
151 shutdown(fd_, SD_BOTH);
155 if (fcntl(fd_, F_SETFL, fcntl(fd_, F_GETFL) | O_NONBLOCK) < 0) {
156 shutdown(fd_, SHUT_RDWR);
159 throw std::runtime_error(
"failed to pu the socket in non-blocking mode");
165 shutdown(fd_, SD_BOTH);
169 shutdown(fd_, SHUT_RDWR);
174 int RecvFrom(
unsigned char* buffer,
size_t max_buf_size)
const override {
175 struct sockaddr_in6 server_addr {};
177 socklen_t addr_len =
sizeof(server_addr);
178 return (
int)recvfrom(fd_, buffer, max_buf_size, 0, (
struct sockaddr*)&server_addr, &addr_len);
181 void SendTo(
unsigned char* buffer,
size_t buf_size)
const override {