WinStd
Additional templates and function helpers for Microsoft Windows using Standard C++ classes
WinSock2.h
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 1991-2022 Amebis
4 Copyright © 2016 GÉANT
5*/
6
7#pragma once
8
9#include "Common.h"
10#include <WinSock2.h>
11#include <ws2def.h>
12#include <WS2tcpip.h>
13
14namespace winstd
15{
21
26 {
27 public:
34 ws2_runtime_error(_In_ error_type num, _In_ const std::string& msg) : num_runtime_error<int>(num, msg)
35 {
36 }
37
44 ws2_runtime_error(_In_ error_type num, _In_opt_z_ const char *msg = nullptr) : num_runtime_error<int>(num, msg)
45 {
46 }
47
53 ws2_runtime_error(_In_ const std::string& msg) : num_runtime_error<int>(WSAGetLastError(), msg)
54 {
55 }
56
62 ws2_runtime_error(_In_opt_z_ const char *msg = nullptr) : num_runtime_error<int>(WSAGetLastError(), msg)
63 {
64 }
65
71 tstring msg(_In_opt_ DWORD dwLanguageId = 0) const
72 {
73 tstring str;
74 if (FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, 0, m_num, dwLanguageId, str, NULL)) {
75 // Stock Windows error messages contain CRLF. Well... Trim all the trailing white space.
76 str.erase(str.find_last_not_of(_T(" \t\n\r\f\v")) + 1);
77 } else
78 sprintf(str, m_num >= 0x10000 ? _T("Error 0x%X") : _T("Error %u"), m_num);
79 return str;
80 }
81 };
82
84
87
88#if (NTDDI_VERSION >= NTDDI_WINXPSP2) || (_WIN32_WINNT >= 0x0502)
89
95 class addrinfo : public handle<PADDRINFOA, NULL>
96 {
98
99 public:
105 virtual ~addrinfo()
106 {
107 if (m_h != invalid)
109 }
110
111 protected:
117 void free_internal() noexcept override
118 {
119 FreeAddrInfoA(m_h);
120 }
121 };
122
128 class waddrinfo : public handle<PADDRINFOW, NULL>
129 {
131
132 public:
138 virtual ~waddrinfo()
139 {
140 if (m_h != invalid)
142 }
143
144 protected:
150 void free_internal() noexcept override
151 {
152 FreeAddrInfoW(m_h);
153 }
154 };
155
159#ifdef _UNICODE
160 typedef waddrinfo taddrinfo;
161#else
163#endif
164
165#endif
166
168}
169
172
173#pragma warning(push)
174#pragma warning(disable: 4505) // Don't warn on unused code
175
177static INT GetAddrInfoA(
178 _In_opt_ PCSTR pNodeName,
179 _In_opt_ PCSTR pServiceName,
180 _In_opt_ const ADDRINFOA *pHints,
181 _Inout_ winstd::addrinfo &result)
182{
183 PADDRINFOA h;
184 INT iResult = GetAddrInfoA(pNodeName, pServiceName, pHints, &h);
185 if (iResult == 0)
186 result.attach(h);
187 return iResult;
188}
189
195static INT GetAddrInfoW(
196 _In_opt_ PCWSTR pNodeName,
197 _In_opt_ PCWSTR pServiceName,
198 _In_opt_ const ADDRINFOW *pHints,
199 _Inout_ winstd::waddrinfo &result)
200{
201 PADDRINFOW h;
202 INT iResult = GetAddrInfoW(pNodeName, pServiceName, pHints, &h);
203 if (iResult == 0)
204 result.attach(h);
205 return iResult;
206}
207
208#pragma warning(pop)
209
SID wrapper class.
Definition: WinSock2.h:96
void free_internal() noexcept override
Frees address information.
Definition: WinSock2.h:117
virtual ~addrinfo()
Frees address information.
Definition: WinSock2.h:105
Base abstract template class to support generic object handle keeping.
Definition: Common.h:603
handle_type m_h
Object handle.
Definition: Common.h:854
Numerical runtime error.
Definition: Common.h:1002
int error_type
Error number type.
Definition: Common.h:1004
error_type m_num
Numeric error code.
Definition: Common.h:1040
SID wrapper class.
Definition: WinSock2.h:129
virtual ~waddrinfo()
Frees address information.
Definition: WinSock2.h:138
void free_internal() noexcept override
Frees address information.
Definition: WinSock2.h:150
WinSock2 runtime error.
Definition: WinSock2.h:26
ws2_runtime_error(error_type num, const char *msg=nullptr)
Constructs an exception.
Definition: WinSock2.h:44
ws2_runtime_error(const char *msg=nullptr)
Constructs an exception using WSAGetLastError()
Definition: WinSock2.h:62
ws2_runtime_error(error_type num, const std::string &msg)
Constructs an exception.
Definition: WinSock2.h:34
ws2_runtime_error(const std::string &msg)
Constructs an exception using WSAGetLastError()
Definition: WinSock2.h:53
tstring msg(DWORD dwLanguageId=0) const
Returns a user-readable Windows error message.
Definition: WinSock2.h:71
addrinfo taddrinfo
Multi-byte / Wide-character SID wrapper class (according to _UNICODE)
Definition: WinSock2.h:162
std::string tstring
Multi-byte / Wide-character string (according to _UNICODE)
Definition: Common.h:334
#define WINSTD_HANDLE_IMPL(C, INVAL)
Implements default constructors and operators to prevent their auto-generation by compiler.
Definition: Common.h:161
static const PADDRINFOA invalid
Invalid handle value.
Definition: Common.h:613