| 115 | } |
| 116 | |
| 117 | Socket::Socket(const struct addrinfo *const host, const int type) |
| 118 | : m_WSAInitialized(!InitSocketLibrary()) |
| 119 | , m_DestAddr(SOCK_DGRAM == type ? |
| 120 | reinterpret_cast<const struct sockaddr *>( |
| 121 | &m_SockAddress) : |
| 122 | nullptr) |
| 123 | , m_DestAddrLen(0) |
| 124 | { |
| 125 | for (auto rp = host; rp; rp = rp->ai_next) { |
| 126 | m_Socket = socket(rp->ai_family, type, 0); |
| 127 | if (INVALID_SOCKET == m_Socket) { |
| 128 | continue; |
| 129 | } |
| 130 | if (SOCK_STREAM == type) { |
| 131 | if (::connect(m_Socket, rp->ai_addr, rp->ai_addrlen)) { |
| 132 | LOG_WARN("Socket(): connect failed"); |
| 133 | closesocket(m_Socket); |
| 134 | m_Socket = INVALID_SOCKET; |
| 135 | continue; |
| 136 | } |
| 137 | } else { /*if (SOCK_DGRAM == type)*/ |
| 138 | #if defined(_WIN32) || defined(__CYGWIN__) |
| 139 | // MSVC on Windows is the only platform using different types for connect() and ai_addrlen ... |
| 140 | m_DestAddrLen = static_cast<decltype(m_DestAddrLen)>( |
| 141 | rp->ai_addrlen); |
| 142 | #else |
| 143 | m_DestAddrLen = rp->ai_addrlen; |
| 144 | #endif |
| 145 | } |
| 146 | memcpy(&m_SockAddress, rp->ai_addr, |
| 147 | std::min<size_t>(sizeof(m_SockAddress), rp->ai_addrlen)); |
| 148 | return; |
| 149 | } |
| 150 | LOG_ERROR("Unable to create socket"); |
| 151 | throw std::system_error(WSAGetLastError(), std::system_category()); |
| 152 | } |
| 153 | |
| 154 | Socket::~Socket() |
| 155 | { |
nothing calls this directly
no test coverage detected