Librería para enchufes en C.
at main 82 lines 1.6 kB view raw
1#ifndef ENCHUFE_H_ 2#define ENCHUFE_H_ 3#include <errno.h> 4#include <netinet/in.h> 5#include <stdint.h> 6#include <stdio.h> 7#include <stdlib.h> 8#include <string.h> 9#include <sys/socket.h> 10 11#define try(a) do { \ 12 if ((a) < 0) { \ 13 fprintf(stderr, "[ERROR]: %s:%d In function %s: %s\n", __FILE__, __LINE__, __FUNCTION__, strerror(errno)); \ 14 exit (EXIT_FAILURE); \ 15 } \ 16 } while(0) 17 18typedef int FD; // short for FileDescriptor 19typedef uint16_t Port; 20typedef uint8_t Byte; 21 22typedef struct { 23 Byte* buf; 24 size_t len; 25} Buffer; 26 27Buffer atob(const char* str); 28 29typedef union { 30 Byte bytes[4]; 31 uint32_t ip; 32} IPv4; 33 34typedef struct { 35 FD fd; 36 struct sockaddr_in addr; 37 socklen_t addrlen; 38} Enchufe; 39 40typedef struct { 41 struct sockaddr_in addr; 42 socklen_t addrlen; 43} Receptaculo; 44 45inline FD nuevo() { 46 FD fd = socket(PF_INET, SOCK_STREAM, 0); 47 try (fd); 48 return fd; 49} 50 51inline Receptaculo receptaculo(IPv4 ip, Port port) { 52 struct sockaddr_in name = { 53 .sin_family = AF_INET, 54 .sin_port = port, 55 .sin_addr = { 56 .s_addr = ip.ip, 57 }, 58 }; 59 return (Receptaculo){ 60 .addr = name, 61 .addrlen = sizeof(name), 62 }; 63} 64 65inline Enchufe aplasta(FD fd, Receptaculo rec) { 66 return (Enchufe){ 67 .fd = fd, 68 .addr = rec.addr, 69 .addrlen = rec.addrlen, 70 }; 71} 72 73Enchufe enchufa(IPv4 ip, Port port); 74void conecta(Enchufe enchufe); 75void amarra(Enchufe enchufe); 76void escucha(Enchufe enchufe, size_t len); 77Enchufe acepta(Enchufe enchufe); 78void zumba(Enchufe enchufe, Buffer in_buf); 79size_t recibe(Enchufe enchufe, Buffer out_buf); 80void desenchufa(Enchufe enchufe); 81 82#endif // ENCHUFE_H_ header