#ifndef TCP_SOCKET_H
#define TCP_SOCKET_H
#include <stdint.h>
#include <stdbool.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include "vma_common.h"
typedef enum {
TCP_STATE_DISCONNECTED = 0,
TCP_STATE_CONNECTING = 1,
TCP_STATE_CONNECTED = 2,
TCP_STATE_LISTENING = 3
} tcp_connection_state_t;
typedef struct {
int socket_fd; vma_options_t vma_options; struct sockaddr_in local_addr; struct sockaddr_in remote_addr; bool is_bound; tcp_connection_state_t state; uint64_t rx_packets; uint64_t tx_packets; uint64_t rx_bytes; uint64_t tx_bytes; int backlog; } tcp_socket_t;
typedef struct {
int socket_fd; struct sockaddr_in addr; uint64_t rx_bytes; uint64_t tx_bytes; } tcp_client_t;
typedef enum {
TCP_SUCCESS = 0,
TCP_ERROR_SOCKET_CREATE = -1,
TCP_ERROR_SOCKET_OPTION = -2,
TCP_ERROR_BIND = -3,
TCP_ERROR_LISTEN = -4,
TCP_ERROR_ACCEPT = -5,
TCP_ERROR_CONNECT = -6,
TCP_ERROR_RECONNECT = -7,
TCP_ERROR_SEND = -8,
TCP_ERROR_RECV = -9,
TCP_ERROR_TIMEOUT = -10,
TCP_ERROR_INVALID_PARAM = -11,
TCP_ERROR_NOT_INITIALIZED = -12,
TCP_ERROR_CLOSED = -13,
TCP_ERROR_WOULD_BLOCK = -14,
TCP_ERROR_ALREADY_CONNECTED = -15
} tcp_result_t;
tcp_result_t tcp_socket_init(tcp_socket_t* socket, const vma_options_t* options);
tcp_result_t tcp_socket_close(tcp_socket_t* socket);
tcp_result_t tcp_socket_bind(tcp_socket_t* socket, const char* ip, uint16_t port);
tcp_result_t tcp_socket_listen(tcp_socket_t* socket, int backlog);
tcp_result_t tcp_socket_accept(tcp_socket_t* socket, tcp_client_t* client, int timeout_ms);
tcp_result_t tcp_socket_connect(tcp_socket_t* socket, const char* ip, uint16_t port, int timeout_ms);
tcp_result_t tcp_socket_reconnect(tcp_socket_t* socket, int timeout_ms);
bool tcp_socket_is_connected(tcp_socket_t* socket);
tcp_result_t tcp_socket_send(tcp_socket_t* socket, const void* data, size_t length, size_t* bytes_sent);
tcp_result_t tcp_socket_send_to_client(tcp_client_t* client, const void* data, size_t length, size_t* bytes_sent);
tcp_result_t tcp_socket_recv(tcp_socket_t* socket, void* buffer, size_t buffer_size,
int timeout_ms, size_t* bytes_received);
tcp_result_t tcp_socket_recv_from_client(tcp_client_t* client, void* buffer, size_t buffer_size,
int timeout_ms, size_t* bytes_received);
tcp_result_t tcp_socket_close_client(tcp_client_t* client);
tcp_result_t tcp_socket_setopt(tcp_socket_t* socket, int level, int optname,
const void* optval, socklen_t optlen);
tcp_result_t tcp_socket_get_stats(tcp_socket_t* socket, uint64_t* rx_packets,
uint64_t* tx_packets, uint64_t* rx_bytes,
uint64_t* tx_bytes);
#endif