/*! * 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_