/*! * Copyright (c) 2019 by Contributors * @file tcp_socket.h * @brief TCP socket for DGL distributed training. */ #ifndef DGL_RPC_NETWORK_TCP_SOCKET_H_ #define DGL_RPC_NETWORK_TCP_SOCKET_H_ #ifdef _WIN32 #include #include #pragma comment(lib, "Ws2_32.lib") #else // !_WIN32 #include #endif // _WIN32 #include namespace dgl { namespace network { /*! * @brief TCPSocket is a simple wrapper around a socket. * It supports only TCP connections. */ class TCPSocket { public: /*! * @brief TCPSocket constructor */ TCPSocket(); /*! * @brief TCPSocket deconstructor */ ~TCPSocket(); /*! * @brief Connect to a given server address * @param ip ip address * @param port end port * @return true for success and false for failure */ bool Connect(const char* ip, int port); /*! * @brief Bind on the given IP and PORT * @param ip ip address * @param port end port * @return true for success and false for failure */ bool Bind(const char* ip, int port); /*! * @brief listen for remote connection * @param max_connection maximal connection * @return true for success and false for failure */ bool Listen(int max_connection); /*! * @brief wait doe a new connection * @param socket new SOCKET will be stored to socket * @param ip_client new IP will be stored to ip_client * @param port_client new PORT will be stored to port_client * @return true for success and false for failure */ bool Accept(TCPSocket* socket, std::string* ip_client, int* port_client); /*! * @brief SetNonBlocking() is needed refering to this example of epoll: * http://www.kernel.org/doc/man-pages/online/pages/man4/epoll.4.html * @param flag true for nonblocking, false for blocking * @return true for success and false for failure */ bool SetNonBlocking(bool flag); /*! * @brief Set timeout for socket * @param timeout seconds timeout */ void SetTimeout(int timeout); /*! * @brief Shut down one or both halves of the connection. * @param ways ways for shutdown * If ways is SHUT_RD, further receives are disallowed. * If ways is SHUT_WR, further sends are disallowed. * If ways is SHUT_RDWR, further sends and receives are disallowed. * @return true for success and false for failure */ bool ShutDown(int ways); /*! * @brief close socket. */ void Close(); /*! * @brief Send data. * @param data data for sending * @param len_data length of data * @return return number of bytes sent if OK, -1 on error */ int64_t Send(const char* data, int64_t len_data); /*! * @brief Receive data. * @param buffer buffer for receving * @param size_buffer size of buffer * @return return number of bytes received if OK, -1 on error */ int64_t Receive(char* buffer, int64_t size_buffer); /*! * @brief Get socket's file descriptor * @return socket's file descriptor */ int Socket() const; private: /*! * @brief socket's file descriptor */ int socket_; }; } // namespace network } // namespace dgl #endif // DGL_RPC_NETWORK_TCP_SOCKET_H_