stdex
Additional custom or not Standard C++ covered algorithms
Loading...
Searching...
No Matches
socket.hpp
1/*
2 SPDX-License-Identifier: MIT
3 Copyright © 2023-2024 Amebis
4*/
5
6#pragma once
7
8#include "compat.hpp"
9#include "system.hpp"
10#if defined(_WIN32)
11#include "windows.h"
12#include <WinSock2.h>
13#else
14#include <netdb.h>
15#include <sys/socket.h>
16#include <sys/types.h>
17#include <unistd.h>
18#endif
19#include <memory>
20
21namespace stdex
22{
23#ifdef _WIN32
24 using socket_t = SOCKET;
25 constexpr socket_t invalid_socket = INVALID_SOCKET;
26 inline int closesocket(_In_ socket_t socket) { return ::closesocket(socket); }
27#else
28 using socket_t = int;
29 constexpr socket_t invalid_socket = ((socket_t)-1);
30 inline int closesocket(_In_ socket_t socket) { return ::close(socket); }
31#endif
32
37 {
38 static inline const socket_t invalid_handle = stdex::invalid_socket;
39
43 static void close(_In_ socket_t h)
44 {
45 int result = closesocket(h);
46#ifdef _WIN32
47 int werrno = WSAGetLastError();
48 if (result >= 0 || werrno == WSAENOTSOCK)
49 return;
50 throw std::system_error(werrno, std::system_category(), "closesocket failed");
51#else
52 if (result >= 0 || errno == EBADF)
53 return;
54 throw std::system_error(errno, std::system_category(), "closesocket failed");
55#endif
56 }
57 };
58
62 using socket = basic_sys_object<socket_t, socket_traits>;
63
64#ifdef _WIN32
68 struct FreeAddrInfoA_delete
69 {
73 void operator()(_In_ ADDRINFOA* ptr) const
74 {
75 FreeAddrInfoA(ptr);
76 }
77 };
78
82 using addrinfo = std::unique_ptr<ADDRINFOA, FreeAddrInfoA_delete>;
83
87 struct FreeAddrInfoW_delete
88 {
92 void operator()(_In_ ADDRINFOW* ptr) const
93 {
94 FreeAddrInfoW(ptr);
95 }
96 };
97
101 using addrinfo = std::unique_ptr<ADDRINFOW, FreeAddrInfoW_delete>;
102
106#ifdef UNICODE
107 using saddrinfo = waddrinfo;
108#else
109 using saddrinfo = addrinfo;
110#endif
111#else
116 {
120 void operator()(_In_ struct addrinfo* ptr) const
121 {
122 freeaddrinfo(ptr);
123 }
124 };
125
129 using addrinfo = std::unique_ptr<struct addrinfo, freeaddrinfo_delete>;
130 using saddrinfo = addrinfo;
131#endif
132}
Deleter for unique_ptr using freeaddrinfo.
Definition socket.hpp:116
void operator()(struct addrinfo *ptr) const
Delete a pointer.
Definition socket.hpp:120
Socket operations.
Definition socket.hpp:37
static void close(socket_t h)
Closes socket.
Definition socket.hpp:43