#ifndef _TCP_H_ #define _TCP_H_ #include #include #include struct tcp_conf { int ipproto; int reuseaddr; int checksum; unsigned short port; union { struct { struct in_addr inet_addr; } ipv4; struct { struct in6_addr inet_addr6; int scope_id; } ipv6; } server; union { struct in_addr inet_addr; struct in6_addr inet_addr6; } client; int sndbuf; int rcvbuf; }; struct tcp_stats { uint64_t bytes; uint64_t messages; uint64_t error; }; enum tcp_sock_state { TCP_SERVER_ACCEPTING, TCP_SERVER_CONNECTED, TCP_CLIENT_DISCONNECTED, TCP_CLIENT_CONNECTED }; struct tcp_sock { int state; /* enum tcp_sock_state */ int fd; int client_fd; /* only for the server side */ union { struct sockaddr_in ipv4; struct sockaddr_in6 ipv6; } addr; socklen_t sockaddr_len; struct tcp_stats stats; struct tcp_conf *conf; }; struct tcp_sock *tcp_server_create(struct tcp_conf *conf); void tcp_server_destroy(struct tcp_sock *m); struct tcp_sock *tcp_client_create(struct tcp_conf *conf); void tcp_client_destroy(struct tcp_sock *m); ssize_t tcp_send(struct tcp_sock *m, const void *data, int size); ssize_t tcp_recv(struct tcp_sock *m, void *data, int size); int tcp_accept(struct tcp_sock *m); int tcp_get_fd(struct tcp_sock *m); int tcp_isset(struct tcp_sock *m, fd_set *readfds); int tcp_accept_isset(struct tcp_sock *m, fd_set *readfds); int tcp_snprintf_stats(char *buf, size_t buflen, char *ifname, struct tcp_sock *s, struct tcp_sock *r); int tcp_snprintf_stats2(char *buf, size_t buflen, const char *ifname, const char *status, int active, struct tcp_stats *s, struct tcp_stats *r); #endif