src.dualinventive.com/dinet/libdipp/include/di/TCPClient.h

100 lines
2.3 KiB
C++

/**
* @file include/di/TCPClient.h
* @brief Generic TCP client
* @date April 28, 2015
* @author R.W.A. van der Heijden & J.J.J. Jacobs
* @copyright 2015 Dual Inventive Technology Centre B.V.
*
* Generic TCP client which resolves and connect to a TCP socket
*/
#ifndef INCLUDE_DI_TCPCLIENT_H_
#define INCLUDE_DI_TCPCLIENT_H_
#include <string>
#include <thread>
#include <memory>
#include <chrono>
namespace Di {
/**
* @class TCPClient
*
* Generic TCP client, connects to hostname and port
*/
class TCPClient {
public:
enum SelectResult {
SELECT_TIMEOUT,
SELECT_READ,
SELECT_ERROR
};
/**
* Constructor, expects a string in the format: "host:port"
*/
explicit TCPClient(std::string hostport);
/**
* Constructor, resolves and connects to host:port
*/
TCPClient(std::string host, unsigned int port);
/**
* Destructor, also closes the connection when needed
*/
~TCPClient(void);
/**
* Send data to the socket
* @param data Data to send over the socket
* @return -1 on failure or when connection is closed, else number of bytes written
*/
ssize_t send(const std::string &data);
ssize_t send(const char *data, size_t len);
ssize_t sendLine(std::string data);
#ifdef DI_BUFFER_DECL
ssize_t send(const struct di_buffer &buf) {
return send(reinterpret_cast<char *>(buf.data), buf.used);
}
ssize_t send(const struct di_buffer *buf) {
return send(reinterpret_cast<char *>(buf->data), buf->used);
}
#endif
ssize_t read(uint8_t *buffer, size_t maxReadSize);
#ifdef DI_BUFFER_DECL
ssize_t read(struct di_buffer *buf) {
auto ret = read(buf->cur, buf->size - buf->used);
if (ret > 0) {
buf->used += static_cast<size_t>(ret);
buf->cur = &buf->data[buf->used];
}
return ret;
}
#endif
ssize_t readByte(char *buf);
ssize_t readLine(std::shared_ptr<std::string> buffer);
enum SelectResult selectIn(std::chrono::system_clock::duration to);
enum SelectResult selectIn(size_t timeoutMs);
bool connected(void);
/**
* Connect to __host:__port
*/
void connect(void);
/**
* Disconnect from host (when connected)
*/
void disconnect(void);
private:
std::string __host; //!< Hostname of server
unsigned int __port; //!< Port of server
bool __connected; //!< Boolean whether we are connected or not
int __sockfd; //!< Socket FD
};
} // namespace Di
#endif // INCLUDE_DI_TCPCLIENT_H_