Threads and Scheduling
1#include "enchufe.h"
2#include <unistd.h> // read, close and other POSIX functions
3#include <sys/socket.h> // all the socket functions
4#include <netinet/in.h> // sockaddr_in
5#include <arpa/inet.h> // inet_pton
6
7// Esta funcion llama a tres otras funciones inline.
8Enchufe enchufa(IPv4 ip, Port port) {
9 return aplasta(nuevo(), receptaculo(ip, port));
10}
11
12// Wrapper para connect.
13void conecta(Enchufe enchufe) {
14 try (connect(enchufe.fd, (const struct sockaddr*)&enchufe.addr, enchufe.addrlen));
15}
16
17// Wrapper para bind.
18void amarra(Enchufe enchufe) {
19 try (bind(enchufe.fd, (struct sockaddr*)&enchufe.addr, enchufe.addrlen));
20}
21
22// Wrapper para liste.
23void escucha(Enchufe enchufe, size_t len) {
24 listen(enchufe.fd, (int)len);
25}
26
27// Wrapper para acepta.
28Enchufe acepta(Enchufe enchufe) {
29 FD fd = accept(enchufe.fd, (struct sockaddr*)&enchufe.addr, &enchufe.addrlen);
30 try (fd);
31 return (Enchufe){
32 .fd = fd,
33 .addr = enchufe.addr,
34 .addrlen = enchufe.addrlen,
35 };
36}
37
38// Wrapper para zumba.
39void zumba(Enchufe enchufe, Buffer buf) {
40 try (write(enchufe.fd, buf.buf, buf.len));
41}
42
43// Wrapper para recibe.
44size_t recibe(Enchufe enchufe, Buffer buf) {
45 int64_t bytes_read = read(enchufe.fd, buf.buf, buf.len);
46 try (bytes_read);
47 return (size_t)bytes_read;
48}
49
50// Wrapper para close.
51void desenchufa(Enchufe enchufe) {
52 close(enchufe.fd);
53}
54
55// Esta funcion convierte un string a un buffer.
56Buffer atob(const char* str) {
57 return (Buffer){
58 .buf = (Byte*)str,
59 .len = strlen(str),
60 };
61}