#ifndef ENCHUFE_H_ #define ENCHUFE_H_ #include #include #include #include #include #include #include #define try(a) do { \ if ((a) < 0) { \ fprintf(stderr, "[ERROR]: %s:%d In function %s: %s\n", __FILE__, __LINE__, __FUNCTION__, strerror(errno)); \ exit (EXIT_FAILURE); \ } \ } while(0) typedef int FD; // short for FileDescriptor typedef uint16_t Port; typedef uint8_t Byte; typedef struct { Byte* buf; size_t len; } Buffer; Buffer atob(const char* str); typedef union { Byte bytes[4]; uint32_t ip; } IPv4; typedef struct { FD fd; struct sockaddr_in addr; socklen_t addrlen; } Enchufe; typedef struct { struct sockaddr_in addr; socklen_t addrlen; } Receptaculo; inline FD nuevo() { FD fd = socket(PF_INET, SOCK_STREAM, 0); try (fd); return fd; } inline Receptaculo receptaculo(IPv4 ip, Port port) { struct sockaddr_in name = { .sin_family = AF_INET, .sin_port = port, .sin_addr = { .s_addr = ip.ip, }, }; return (Receptaculo){ .addr = name, .addrlen = sizeof(name), }; } inline Enchufe aplasta(FD fd, Receptaculo rec) { return (Enchufe){ .fd = fd, .addr = rec.addr, .addrlen = rec.addrlen, }; } Enchufe enchufa(IPv4 ip, Port port); void conecta(Enchufe enchufe); void amarra(Enchufe enchufe); void escucha(Enchufe enchufe, size_t len); Enchufe acepta(Enchufe enchufe); void zumba(Enchufe enchufe, Buffer in_buf); size_t recibe(Enchufe enchufe, Buffer out_buf); void desenchufa(Enchufe enchufe); #endif // ENCHUFE_H_ header