|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef __TRANSPORT_CLIENT_TCP_H__
|
|
|
#define __TRANSPORT_CLIENT_TCP_H__
|
|
|
|
|
|
#if defined(_OS_WINDOWS)
|
|
|
|
|
|
#include <stdio.h>
|
|
|
#include <winsock2.h>
|
|
|
#elif defined(_OS_UNIX)
|
|
|
|
|
|
#include <sys/types.h>
|
|
|
#include <sys/socket.h>
|
|
|
#include <netinet/in.h>
|
|
|
#include <arpa/inet.h>
|
|
|
#include <netdb.h>
|
|
|
#include <sys/select.h>
|
|
|
#include <sys/fcntl.h>
|
|
|
|
|
|
#include <iostream>
|
|
|
#include <unistd.h>
|
|
|
#include <ctime>
|
|
|
#include <stdio.h>
|
|
|
#include <unistd.h>
|
|
|
#include <cerrno>
|
|
|
#include <cstdio>
|
|
|
#include <cstring>
|
|
|
#include <cstdlib>
|
|
|
#else
|
|
|
#pragma message("WARNING: Unknown OS Type!")
|
|
|
#endif
|
|
|
|
|
|
#include <atomic>
|
|
|
#include <thread>
|
|
|
#include <mutex>
|
|
|
|
|
|
#include <string>
|
|
|
#include <functional>
|
|
|
#include <exception>
|
|
|
|
|
|
#include <iostream>
|
|
|
#include <chrono>
|
|
|
|
|
|
#include "ITransportClient.h"
|
|
|
#include "common/KinovaTcpUtilities.h"
|
|
|
#include "common/WindowsNetworking.h"
|
|
|
|
|
|
namespace Kinova
|
|
|
{
|
|
|
namespace Api
|
|
|
{
|
|
|
class TransportClientTcp : public ITransportClient
|
|
|
{
|
|
|
private:
|
|
|
const uint32_t kApiPort = 10000;
|
|
|
|
|
|
bool m_isInitialized;
|
|
|
struct sockaddr_in m_socketAddr{};
|
|
|
socklen_t m_socketAddrSize{};
|
|
|
int32_t m_socketFd{};
|
|
|
#if defined(_OS_WINDOWS)
|
|
|
WSADATA m_wsa{};
|
|
|
#endif
|
|
|
|
|
|
bool m_isUsingRcvThread;
|
|
|
std::atomic<bool> m_isRunning { true };
|
|
|
std::mutex m_sendMutex;
|
|
|
|
|
|
|
|
|
fd_set m_original_rx{};
|
|
|
fd_set m_readfds{};
|
|
|
|
|
|
int numfd{};
|
|
|
struct hostent *m_host{};
|
|
|
struct timeval m_tv{};
|
|
|
|
|
|
|
|
|
|
|
|
static constexpr uint32_t kMaxTxBufferSize = 65495;
|
|
|
static constexpr uint32_t kMaxRxBufferSize = 65495;
|
|
|
static constexpr uint32_t kMaxBufferSize = 16777216;
|
|
|
|
|
|
bool m_bIsReceiving { false };
|
|
|
uint32_t m_nTotalBytesRead {0};
|
|
|
uint32_t m_nTotalBytesToRead {0};
|
|
|
uint8_t* m_tx_buffer;
|
|
|
uint8_t* m_rx_buffer;
|
|
|
|
|
|
uint32_t m_current_buffer_size_rx = { kMaxRxBufferSize };
|
|
|
uint32_t m_current_buffer_size_tx = { kMaxTxBufferSize };
|
|
|
|
|
|
|
|
|
KinovaTcpUtilities m_utilities_object;
|
|
|
|
|
|
std::function<void (const char*, uint32_t) > m_onMessageCallback;
|
|
|
|
|
|
|
|
|
public:
|
|
|
TransportReadyStateEnum readyState;
|
|
|
std::thread m_receiveThread;
|
|
|
|
|
|
explicit TransportClientTcp(bool isUsingRcvThread = true);
|
|
|
~TransportClientTcp() override;
|
|
|
|
|
|
bool connect(std::string host = "127.0.0.1", uint32_t port = 10000) override;
|
|
|
void disconnect() override;
|
|
|
|
|
|
void send(const char* txBuffer, uint32_t txSize) override;
|
|
|
void onMessage(std::function<void (const char*, uint32_t)> callback) override;
|
|
|
|
|
|
char* getTxBuffer(uint32_t const& allocation_size) override;
|
|
|
size_t getMaxTxBufferSize() override { return kMaxBufferSize; }
|
|
|
|
|
|
int processReceive(long rcvTimeout_usec);
|
|
|
int processReceive(struct timeval rcvTimeout_tv);
|
|
|
|
|
|
virtual void getHostAddress(std::string &host, uint32_t &port) override {
|
|
|
host = mHostAddress;
|
|
|
port = mHostPort;
|
|
|
};
|
|
|
|
|
|
private:
|
|
|
|
|
|
std::string mHostAddress;
|
|
|
uint32_t mHostPort;
|
|
|
|
|
|
void receiveThread(std::atomic<bool> &program_is_running);
|
|
|
|
|
|
int callReceiveFrom();
|
|
|
};
|
|
|
|
|
|
}
|
|
|
}
|
|
|
|
|
|
#endif
|
|
|
|