Librería para enchufes en C.
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