network.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652
  1. // Copyright 2020 yuzu emulator team
  2. // Licensed under GPLv2 or any later version
  3. // Refer to the license.txt file included.
  4. #include <algorithm>
  5. #include <cstring>
  6. #include <limits>
  7. #include <utility>
  8. #include <vector>
  9. #ifdef _WIN32
  10. #define _WINSOCK_DEPRECATED_NO_WARNINGS // gethostname
  11. #include <winsock2.h>
  12. #elif __unix__
  13. #include <errno.h>
  14. #include <fcntl.h>
  15. #include <netdb.h>
  16. #include <poll.h>
  17. #include <unistd.h>
  18. #else
  19. #error "Unimplemented platform"
  20. #endif
  21. #include "common/assert.h"
  22. #include "common/common_types.h"
  23. #include "common/logging/log.h"
  24. #include "core/network/network.h"
  25. #include "core/network/sockets.h"
  26. namespace Network {
  27. namespace {
  28. #ifdef _WIN32
  29. using socklen_t = int;
  30. void Initialize() {
  31. WSADATA wsa_data;
  32. (void)WSAStartup(MAKEWORD(2, 2), &wsa_data);
  33. }
  34. void Finalize() {
  35. WSACleanup();
  36. }
  37. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  38. auto& bytes = addr.S_un.S_un_b;
  39. return IPv4Address{bytes.s_b1, bytes.s_b2, bytes.s_b3, bytes.s_b4};
  40. }
  41. sockaddr TranslateFromSockAddrIn(SockAddrIn input) {
  42. sockaddr_in result;
  43. #ifdef __unix__
  44. result.sin_len = sizeof(result);
  45. #endif
  46. switch (static_cast<Domain>(input.family)) {
  47. case Domain::INET:
  48. result.sin_family = AF_INET;
  49. break;
  50. default:
  51. UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", static_cast<int>(input.family));
  52. result.sin_family = AF_INET;
  53. break;
  54. }
  55. result.sin_port = htons(input.portno);
  56. auto& ip = result.sin_addr.S_un.S_un_b;
  57. ip.s_b1 = input.ip[0];
  58. ip.s_b2 = input.ip[1];
  59. ip.s_b3 = input.ip[2];
  60. ip.s_b4 = input.ip[3];
  61. sockaddr addr;
  62. std::memcpy(&addr, &result, sizeof(addr));
  63. return addr;
  64. }
  65. LINGER MakeLinger(bool enable, u32 linger_value) {
  66. ASSERT(linger_value <= std::numeric_limits<u_short>::max());
  67. LINGER value;
  68. value.l_onoff = enable ? 1 : 0;
  69. value.l_linger = static_cast<u_short>(linger_value);
  70. return value;
  71. }
  72. int LastError() {
  73. return WSAGetLastError();
  74. }
  75. bool EnableNonBlock(SOCKET fd, bool enable) {
  76. u_long value = enable ? 1 : 0;
  77. return ioctlsocket(fd, FIONBIO, &value) != SOCKET_ERROR;
  78. }
  79. #elif __unix__ // ^ _WIN32 v __unix__
  80. using SOCKET = int;
  81. using WSAPOLLFD = pollfd;
  82. using ULONG = u64;
  83. constexpr SOCKET INVALID_SOCKET = -1;
  84. constexpr SOCKET SOCKET_ERROR = -1;
  85. constexpr int WSAEWOULDBLOCK = EAGAIN;
  86. constexpr int WSAENOTCONN = ENOTCONN;
  87. constexpr int SD_RECEIVE = SHUT_RD;
  88. constexpr int SD_SEND = SHUT_WR;
  89. constexpr int SD_BOTH = SHUT_RDWR;
  90. void Initialize() {}
  91. void Finalize() {}
  92. constexpr IPv4Address TranslateIPv4(in_addr addr) {
  93. const u32 bytes = addr.s_addr;
  94. return IPv4Address{static_cast<u8>(bytes), static_cast<u8>(bytes >> 8),
  95. static_cast<u8>(bytes >> 16), static_cast<u8>(bytes >> 24)};
  96. }
  97. sockaddr TranslateFromSockAddrIn(SockAddrIn input) {
  98. sockaddr_in result;
  99. switch (static_cast<Domain>(input.family)) {
  100. case Domain::INET:
  101. result.sin_family = AF_INET;
  102. break;
  103. default:
  104. UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", static_cast<int>(input.family));
  105. result.sin_family = AF_INET;
  106. break;
  107. }
  108. result.sin_port = htons(input.portno);
  109. result.sin_addr.s_addr = input.ip[0] | input.ip[1] << 8 | input.ip[2] << 16 | input.ip[3] << 24;
  110. sockaddr addr;
  111. std::memcpy(&addr, &result, sizeof(addr));
  112. return addr;
  113. }
  114. int WSAPoll(WSAPOLLFD* fds, ULONG nfds, int timeout) {
  115. return poll(fds, nfds, timeout);
  116. }
  117. int closesocket(SOCKET fd) {
  118. return close(fd);
  119. }
  120. linger MakeLinger(bool enable, u32 linger_value) {
  121. linger value;
  122. value.l_onoff = enable ? 1 : 0;
  123. value.l_linger = linger_value;
  124. return value;
  125. }
  126. int LastError() {
  127. return errno;
  128. }
  129. bool EnableNonBlock(int fd, bool enable) {
  130. int flags = fcntl(fd, F_GETFD);
  131. if (flags == -1) {
  132. return false;
  133. }
  134. if (enable) {
  135. flags |= O_NONBLOCK;
  136. } else {
  137. flags &= ~O_NONBLOCK;
  138. }
  139. return fcntl(fd, F_SETFD, flags) == 0;
  140. }
  141. #endif
  142. int TranslateDomain(Domain domain) {
  143. switch (domain) {
  144. case Domain::INET:
  145. return AF_INET;
  146. default:
  147. UNIMPLEMENTED_MSG("Unimplemented domain={}", static_cast<int>(domain));
  148. return 0;
  149. }
  150. }
  151. int TranslateType(Type type) {
  152. switch (type) {
  153. case Type::STREAM:
  154. return SOCK_STREAM;
  155. case Type::DGRAM:
  156. return SOCK_DGRAM;
  157. default:
  158. UNIMPLEMENTED_MSG("Unimplemented type={}", static_cast<int>(type));
  159. return 0;
  160. }
  161. }
  162. int TranslateProtocol(Protocol protocol) {
  163. switch (protocol) {
  164. case Protocol::TCP:
  165. return IPPROTO_TCP;
  166. case Protocol::UDP:
  167. return IPPROTO_UDP;
  168. default:
  169. UNIMPLEMENTED_MSG("Unimplemented protocol={}", static_cast<int>(protocol));
  170. return 0;
  171. }
  172. }
  173. SockAddrIn TranslateToSockAddrIn(sockaddr input_) {
  174. sockaddr_in input;
  175. std::memcpy(&input, &input_, sizeof(input));
  176. SockAddrIn result;
  177. switch (input.sin_family) {
  178. case AF_INET:
  179. result.family = Domain::INET;
  180. break;
  181. default:
  182. UNIMPLEMENTED_MSG("Unhandled sockaddr family={}", input.sin_family);
  183. result.family = Domain::INET;
  184. break;
  185. }
  186. result.portno = ntohs(input.sin_port);
  187. result.ip = TranslateIPv4(input.sin_addr);
  188. return result;
  189. }
  190. u16 TranslatePollEvents(u16 events) {
  191. u16 result = 0;
  192. if (events & POLL_IN) {
  193. events &= ~POLL_IN;
  194. result |= POLLIN;
  195. }
  196. if (events & POLL_PRI) {
  197. events &= ~POLL_PRI;
  198. #ifdef _WIN32
  199. LOG_WARNING(Service, "Winsock doesn't support POLLPRI");
  200. #else
  201. result |= POLL_PRI;
  202. #endif
  203. }
  204. if (events & POLL_OUT) {
  205. events &= ~POLL_OUT;
  206. result |= POLLOUT;
  207. }
  208. UNIMPLEMENTED_IF_MSG(events != 0, "Unhandled guest events=0x{:x}", events);
  209. return result;
  210. }
  211. u16 TranslatePollRevents(u16 revents) {
  212. u16 result = 0;
  213. const auto translate = [&result, &revents](int host, unsigned guest) {
  214. if (revents & host) {
  215. revents &= ~host;
  216. result |= guest;
  217. }
  218. };
  219. translate(POLLIN, POLL_IN);
  220. translate(POLLPRI, POLL_PRI);
  221. translate(POLLOUT, POLL_OUT);
  222. translate(POLLERR, POLL_ERR);
  223. translate(POLLHUP, POLL_HUP);
  224. UNIMPLEMENTED_IF_MSG(revents != 0, "Unhandled host revents=0x{:x}", revents);
  225. return result;
  226. }
  227. template <typename T>
  228. Errno SetSockOpt(SOCKET fd, int option, T value) {
  229. const int result =
  230. setsockopt(fd, SOL_SOCKET, option, reinterpret_cast<const char*>(&value), sizeof(value));
  231. if (result != SOCKET_ERROR) {
  232. return Errno::SUCCESS;
  233. }
  234. const int ec = LastError();
  235. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  236. return Errno::SUCCESS;
  237. }
  238. } // Anonymous namespace
  239. NetworkInstance::NetworkInstance() {
  240. Initialize();
  241. }
  242. NetworkInstance::~NetworkInstance() {
  243. Finalize();
  244. }
  245. std::pair<IPv4Address, Errno> GetHostIPv4Address() {
  246. std::array<char, 256> name{};
  247. if (gethostname(name.data(), static_cast<int>(name.size()) - 1) == SOCKET_ERROR) {
  248. UNIMPLEMENTED_MSG("Unhandled gethostname error");
  249. return {IPv4Address{}, Errno::SUCCESS};
  250. }
  251. hostent* const ent = gethostbyname(name.data());
  252. if (!ent) {
  253. UNIMPLEMENTED_MSG("Unhandled gethostbyname error");
  254. return {IPv4Address{}, Errno::SUCCESS};
  255. }
  256. if (ent->h_addr_list == nullptr) {
  257. UNIMPLEMENTED_MSG("No addr provided in hostent->h_addr_list");
  258. return {IPv4Address{}, Errno::SUCCESS};
  259. }
  260. if (ent->h_length != sizeof(in_addr)) {
  261. UNIMPLEMENTED_MSG("Unexpected size={} in hostent->h_length", ent->h_length);
  262. }
  263. in_addr addr;
  264. std::memcpy(&addr, ent->h_addr_list[0], sizeof(addr));
  265. return {TranslateIPv4(addr), Errno::SUCCESS};
  266. }
  267. std::pair<s32, Errno> Poll(std::vector<PollFD>& pollfds, s32 timeout) {
  268. const size_t num = pollfds.size();
  269. std::vector<WSAPOLLFD> host_pollfds(pollfds.size());
  270. std::transform(pollfds.begin(), pollfds.end(), host_pollfds.begin(), [](PollFD fd) {
  271. WSAPOLLFD result;
  272. result.fd = fd.socket->fd;
  273. result.events = TranslatePollEvents(fd.events);
  274. result.revents = 0;
  275. return result;
  276. });
  277. const int result = WSAPoll(host_pollfds.data(), static_cast<ULONG>(num), timeout);
  278. if (result == 0) {
  279. ASSERT(std::all_of(host_pollfds.begin(), host_pollfds.end(),
  280. [](WSAPOLLFD fd) { return fd.revents == 0; }));
  281. return {0, Errno::SUCCESS};
  282. }
  283. for (size_t i = 0; i < num; ++i) {
  284. pollfds[i].revents = TranslatePollRevents(host_pollfds[i].revents);
  285. }
  286. if (result > 0) {
  287. return {result, Errno::SUCCESS};
  288. }
  289. ASSERT(result == SOCKET_ERROR);
  290. const int ec = LastError();
  291. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  292. return {-1, Errno::SUCCESS};
  293. }
  294. Socket::~Socket() {
  295. if (fd == INVALID_SOCKET) {
  296. return;
  297. }
  298. (void)closesocket(fd);
  299. fd = INVALID_SOCKET;
  300. }
  301. Socket::Socket(Socket&& rhs) noexcept : fd{std::exchange(rhs.fd, INVALID_SOCKET)} {}
  302. Errno Socket::Initialize(Domain domain, Type type, Protocol protocol) {
  303. fd = socket(TranslateDomain(domain), TranslateType(type), TranslateProtocol(protocol));
  304. if (fd != INVALID_SOCKET) {
  305. return Errno::SUCCESS;
  306. }
  307. const int ec = LastError();
  308. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  309. return Errno::SUCCESS;
  310. }
  311. std::pair<Socket::AcceptResult, Errno> Socket::Accept() {
  312. sockaddr addr;
  313. socklen_t addrlen = sizeof(addr);
  314. const SOCKET new_socket = accept(fd, &addr, &addrlen);
  315. if (new_socket == INVALID_SOCKET) {
  316. const int ec = LastError();
  317. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  318. return {AcceptResult{}, Errno::SUCCESS};
  319. }
  320. AcceptResult result;
  321. result.socket = std::make_unique<Socket>();
  322. result.socket->fd = new_socket;
  323. ASSERT(addrlen == sizeof(sockaddr_in));
  324. result.sockaddr_in = TranslateToSockAddrIn(addr);
  325. return {std::move(result), Errno::SUCCESS};
  326. }
  327. Errno Socket::Connect(SockAddrIn addr_in) {
  328. const sockaddr host_addr_in = TranslateFromSockAddrIn(addr_in);
  329. if (connect(fd, &host_addr_in, sizeof(host_addr_in)) != INVALID_SOCKET) {
  330. return Errno::SUCCESS;
  331. }
  332. switch (const int ec = LastError()) {
  333. case WSAEWOULDBLOCK:
  334. LOG_DEBUG(Service, "EAGAIN generated");
  335. return Errno::AGAIN;
  336. default:
  337. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  338. return Errno::SUCCESS;
  339. }
  340. }
  341. std::pair<SockAddrIn, Errno> Socket::GetPeerName() {
  342. sockaddr addr;
  343. socklen_t addrlen = sizeof(addr);
  344. if (getpeername(fd, &addr, &addrlen) == SOCKET_ERROR) {
  345. const int ec = LastError();
  346. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  347. return {SockAddrIn{}, Errno::SUCCESS};
  348. }
  349. ASSERT(addrlen == sizeof(sockaddr_in));
  350. return {TranslateToSockAddrIn(addr), Errno::SUCCESS};
  351. }
  352. std::pair<SockAddrIn, Errno> Socket::GetSockName() {
  353. sockaddr addr;
  354. socklen_t addrlen = sizeof(addr);
  355. if (getsockname(fd, &addr, &addrlen) == SOCKET_ERROR) {
  356. const int ec = LastError();
  357. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  358. return {SockAddrIn{}, Errno::SUCCESS};
  359. }
  360. ASSERT(addrlen == sizeof(sockaddr_in));
  361. return {TranslateToSockAddrIn(addr), Errno::SUCCESS};
  362. }
  363. Errno Socket::Bind(SockAddrIn addr) {
  364. const sockaddr addr_in = TranslateFromSockAddrIn(addr);
  365. if (bind(fd, &addr_in, sizeof(addr_in)) != SOCKET_ERROR) {
  366. return Errno::SUCCESS;
  367. }
  368. const int ec = LastError();
  369. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  370. return Errno::SUCCESS;
  371. }
  372. Errno Socket::Listen(s32 backlog) {
  373. if (listen(fd, backlog) != SOCKET_ERROR) {
  374. return Errno::SUCCESS;
  375. }
  376. const int ec = LastError();
  377. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  378. return Errno::SUCCESS;
  379. }
  380. Errno Socket::Shutdown(ShutdownHow how) {
  381. int host_how = 0;
  382. switch (how) {
  383. case ShutdownHow::RD:
  384. host_how = SD_RECEIVE;
  385. break;
  386. case ShutdownHow::WR:
  387. host_how = SD_SEND;
  388. break;
  389. case ShutdownHow::RDWR:
  390. host_how = SD_BOTH;
  391. break;
  392. default:
  393. UNIMPLEMENTED_MSG("Unimplemented flag how={}", static_cast<int>(how));
  394. return Errno::SUCCESS;
  395. }
  396. if (shutdown(fd, host_how) != SOCKET_ERROR) {
  397. return Errno::SUCCESS;
  398. }
  399. switch (const int ec = LastError()) {
  400. case WSAENOTCONN:
  401. LOG_ERROR(Service, "ENOTCONN generated");
  402. return Errno::NOTCONN;
  403. default:
  404. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  405. return Errno::SUCCESS;
  406. }
  407. }
  408. std::pair<s32, Errno> Socket::Recv(int flags, std::vector<u8>& message) {
  409. ASSERT(flags == 0);
  410. ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
  411. const int result =
  412. recv(fd, reinterpret_cast<char*>(message.data()), static_cast<int>(message.size()), 0);
  413. if (result != SOCKET_ERROR) {
  414. return {result, Errno::SUCCESS};
  415. }
  416. switch (const int ec = LastError()) {
  417. case WSAEWOULDBLOCK:
  418. LOG_DEBUG(Service, "EAGAIN generated");
  419. return {-1, Errno::AGAIN};
  420. case WSAENOTCONN:
  421. LOG_ERROR(Service, "ENOTCONN generated");
  422. return {-1, Errno::NOTCONN};
  423. default:
  424. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  425. return {0, Errno::SUCCESS};
  426. }
  427. }
  428. std::pair<s32, Errno> Socket::RecvFrom(int flags, std::vector<u8>& message, SockAddrIn* addr) {
  429. ASSERT(flags == 0);
  430. ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
  431. sockaddr addr_in{};
  432. socklen_t addrlen = sizeof(addr_in);
  433. socklen_t* const p_addrlen = addr ? &addrlen : nullptr;
  434. sockaddr* const p_addr_in = addr ? &addr_in : nullptr;
  435. const int result = recvfrom(fd, reinterpret_cast<char*>(message.data()),
  436. static_cast<int>(message.size()), 0, p_addr_in, p_addrlen);
  437. if (result != SOCKET_ERROR) {
  438. if (addr) {
  439. ASSERT(addrlen == sizeof(addr_in));
  440. *addr = TranslateToSockAddrIn(addr_in);
  441. }
  442. return {result, Errno::SUCCESS};
  443. }
  444. switch (const int ec = LastError()) {
  445. case WSAEWOULDBLOCK:
  446. LOG_DEBUG(Service, "EAGAIN generated");
  447. return {-1, Errno::AGAIN};
  448. case WSAENOTCONN:
  449. LOG_ERROR(Service, "ENOTCONN generated");
  450. return {-1, Errno::NOTCONN};
  451. default:
  452. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  453. return {-1, Errno::SUCCESS};
  454. }
  455. }
  456. std::pair<s32, Errno> Socket::Send(const std::vector<u8>& message, int flags) {
  457. ASSERT(message.size() < static_cast<size_t>(std::numeric_limits<int>::max()));
  458. ASSERT(flags == 0);
  459. const int result = send(fd, reinterpret_cast<const char*>(message.data()),
  460. static_cast<int>(message.size()), 0);
  461. if (result != SOCKET_ERROR) {
  462. return {result, Errno::SUCCESS};
  463. }
  464. const int ec = LastError();
  465. switch (ec) {
  466. case WSAEWOULDBLOCK:
  467. LOG_DEBUG(Service, "EAGAIN generated");
  468. return {-1, Errno::AGAIN};
  469. case WSAENOTCONN:
  470. LOG_ERROR(Service, "ENOTCONN generated");
  471. return {-1, Errno::NOTCONN};
  472. default:
  473. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  474. return {-1, Errno::SUCCESS};
  475. }
  476. }
  477. std::pair<s32, Errno> Socket::SendTo(u32 flags, const std::vector<u8>& message,
  478. const SockAddrIn* addr) {
  479. ASSERT(flags == 0);
  480. const sockaddr* to = nullptr;
  481. const int tolen = addr ? 0 : sizeof(sockaddr);
  482. sockaddr host_addr_in;
  483. if (addr) {
  484. host_addr_in = TranslateFromSockAddrIn(*addr);
  485. to = &host_addr_in;
  486. }
  487. const int result = sendto(fd, reinterpret_cast<const char*>(message.data()),
  488. static_cast<int>(message.size()), 0, to, tolen);
  489. if (result != SOCKET_ERROR) {
  490. return {result, Errno::SUCCESS};
  491. }
  492. const int ec = LastError();
  493. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  494. return {-1, Errno::SUCCESS};
  495. }
  496. Errno Socket::Close() {
  497. [[maybe_unused]] const int result = closesocket(fd);
  498. ASSERT(result == 0);
  499. fd = INVALID_SOCKET;
  500. return Errno::SUCCESS;
  501. }
  502. Errno Socket::SetLinger(bool enable, u32 linger) {
  503. return SetSockOpt(fd, SO_LINGER, MakeLinger(enable, linger));
  504. }
  505. Errno Socket::SetReuseAddr(bool enable) {
  506. return SetSockOpt<u32>(fd, SO_REUSEADDR, enable ? 1 : 0);
  507. }
  508. Errno Socket::SetBroadcast(bool enable) {
  509. return SetSockOpt<u32>(fd, SO_BROADCAST, enable ? 1 : 0);
  510. }
  511. Errno Socket::SetSndBuf(u32 value) {
  512. return SetSockOpt(fd, SO_SNDBUF, value);
  513. }
  514. Errno Socket::SetRcvBuf(u32 value) {
  515. return SetSockOpt(fd, SO_RCVBUF, value);
  516. }
  517. Errno Socket::SetSndTimeo(u32 value) {
  518. return SetSockOpt(fd, SO_SNDTIMEO, value);
  519. }
  520. Errno Socket::SetRcvTimeo(u32 value) {
  521. return SetSockOpt(fd, SO_RCVTIMEO, value);
  522. }
  523. Errno Socket::SetNonBlock(bool enable) {
  524. if (EnableNonBlock(fd, enable)) {
  525. return Errno::SUCCESS;
  526. }
  527. const int ec = LastError();
  528. UNREACHABLE_MSG("Unhandled host socket error={}", ec);
  529. return Errno::SUCCESS;
  530. }
  531. bool Socket::IsOpened() const {
  532. return fd != INVALID_SOCKET;
  533. }
  534. } // namespace Network