#include "socket/tcp_socket.h" namespace Network { int TCPSocket::init(int domain) { return init(domain, SOCK_STREAM, 0); } int TCPSocket::listen(int __n) { int retVal = ::listen(sock, __n); if (retVal == INVALID_SOCKET) spdlog::error("listen()"); return retVal; } void TCPSocket::accept(TCPSocket &newSock, Address &__addr) { newSock.set(::accept(sock, &__addr.addr, &__addr.length), domain); memcpy(&newSock.remoteAddr, &__addr, sizeof(Address)); if (newSock.sock == INVALID_SOCKET) spdlog::error("accept()"); } int TCPSocket::connect(Address &serveraddr) { std::string addr_string = serveraddr; int retVal = -1; if (serveraddr.family == AF_INET) retVal = ::connect(sock, (const sockaddr *)&serveraddr.addr_in, serveraddr.length); else retVal = ::connect(sock, (const sockaddr *)&serveraddr.addr_in6, serveraddr.length); memcpy(&remoteAddr, &serveraddr, sizeof(Address)); if (retVal == INVALID_SOCKET) { #ifdef _WIN32 int err = WSAGetLastError(); spdlog::error("connect() failed: WSA error {} (0x{:X})", err, err); #endif spdlog::error("connect()"); } return retVal; } int TCPSocket::recv(void *__restrict __buf, size_t __n, int __flags) { int retVal = ::recv(sock, (char *)__buf, __n, __flags); if (retVal == SOCKET_ERROR) { if (errno == EAGAIN || errno == EWOULDBLOCK) return retVal; spdlog::error("recv()"); } return retVal; } int TCPSocket::send(const void *__buf, size_t __n, int __flags) { int retVal = ::send(sock, (char *)__buf, __n, __flags); if (retVal == SOCKET_ERROR) spdlog::error("send()"); return retVal; } } // namespace Network