| 91 | } |
| 92 | |
| 93 | class TcpSocket { |
| 94 | public: |
| 95 | TcpSocket() { |
| 96 | sockfd_ = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); |
| 97 | if (sockfd_ == INVALID_SOCKET) { |
| 98 | Log::Fatal("Socket construction error"); |
| 99 | return; |
| 100 | } |
| 101 | ConfigSocket(); |
| 102 | } |
| 103 | |
| 104 | explicit TcpSocket(SOCKET socket) { |
| 105 | sockfd_ = socket; |
| 106 | if (sockfd_ == INVALID_SOCKET) { |
| 107 | Log::Fatal("Passed socket error"); |
| 108 | return; |
| 109 | } |
| 110 | ConfigSocket(); |
| 111 | } |
| 112 | |
| 113 | TcpSocket(const TcpSocket &object) { |
| 114 | sockfd_ = object.sockfd_; |
| 115 | ConfigSocket(); |
| 116 | } |
| 117 | ~TcpSocket() { |
| 118 | } |
| 119 | inline void SetTimeout(int timeout) { |
| 120 | setsockopt(sockfd_, SOL_SOCKET, SO_RCVTIMEO, reinterpret_cast<char*>(&timeout), sizeof(timeout)); |
| 121 | } |
| 122 | inline void ConfigSocket() { |
| 123 | if (sockfd_ == INVALID_SOCKET) { |
| 124 | return; |
| 125 | } |
| 126 | |
| 127 | if (setsockopt(sockfd_, SOL_SOCKET, SO_RCVBUF, reinterpret_cast<const char*>(&SocketConfig::kSocketBufferSize), sizeof(SocketConfig::kSocketBufferSize)) != 0) { |
| 128 | Log::Warning("Set SO_RCVBUF failed, please increase your net.core.rmem_max to 100k at least"); |
| 129 | } |
| 130 | |
| 131 | if (setsockopt(sockfd_, SOL_SOCKET, SO_SNDBUF, reinterpret_cast<const char*>(&SocketConfig::kSocketBufferSize), sizeof(SocketConfig::kSocketBufferSize)) != 0) { |
| 132 | Log::Warning("Set SO_SNDBUF failed, please increase your net.core.wmem_max to 100k at least"); |
| 133 | } |
| 134 | if (setsockopt(sockfd_, IPPROTO_TCP, TCP_NODELAY, reinterpret_cast<const char*>(&SocketConfig::kNoDelay), sizeof(SocketConfig::kNoDelay)) != 0) { |
| 135 | Log::Warning("Set TCP_NODELAY failed"); |
| 136 | } |
| 137 | } |
| 138 | |
| 139 | inline static void Startup() { |
| 140 | #if defined(_WIN32) |
| 141 | WSADATA wsa_data; |
| 142 | if (WSAStartup(MAKEWORD(2, 2), &wsa_data) == -1) { |
| 143 | Log::Fatal("Socket error: WSAStartup error"); |
| 144 | } |
| 145 | if (LOBYTE(wsa_data.wVersion) != 2 || HIBYTE(wsa_data.wVersion) != 2) { |
| 146 | WSACleanup(); |
| 147 | Log::Fatal("Socket error: Winsock.dll version error"); |
| 148 | } |
| 149 | #else |
| 150 | #endif |