#include "extremite.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define BUFSIZE 1024 int ext_out(int port) { int server = socket(AF_INET6, SOCK_STREAM, 0); if (server == -1) { perror("socket"); exit(1); } setsockopt(server, SOL_SOCKET, SO_REUSEADDR, &(int) {1}, sizeof (int)); struct sockaddr_in6 server_addr = {0}; server_addr.sin6_family = AF_INET6; server_addr.sin6_port = htons(port); server_addr.sin6_addr = in6addr_any; if (bind(server, (struct sockaddr *) &server_addr, sizeof server_addr) == -1) { perror("bind"); exit(1); } char server_addr_pretty[INET6_ADDRSTRLEN] = ""; inet_ntop(AF_INET6, &(server_addr.sin6_addr), server_addr_pretty, sizeof server_addr_pretty); printf("Écoute sur : %s\n", server_addr_pretty); if (listen(server, 1) == -1) { perror("listen"); exit(1); } struct sockaddr_in6 client_addr; socklen_t client_addr_len; puts("Attente d’un client."); int client = accept(server, (struct sockaddr *) &client_addr, &client_addr_len); close(server); char client_addr_pretty[INET6_ADDRSTRLEN] = ""; inet_ntop(AF_INET6, &(client_addr.sin6_addr), client_addr_pretty, sizeof client_addr_pretty); printf("Client connecté : %s\n", client_addr_pretty); return client; /* char buf[BUFSIZE]; */ /* ssize_t n; */ /* while (1) { */ /* n = read(client, buf, sizeof buf); */ /* if (n == -1) { */ /* perror("read"); */ /* exit(1); */ /* } */ /* n = write(out, buf, n); */ /* if (n == -1) { */ /* perror("write"); */ /* exit(1); */ /* } */ /* } */ /* close(client); */ } int ext_in(const char addr[], int port) { int s = socket(AF_INET6, SOCK_STREAM, 0); if (s == -1) { perror("socket"); exit(1); } struct sockaddr_in6 sa = {0}; sa.sin6_family = AF_INET6; sa.sin6_port = htons(port); inet_pton(AF_INET6, addr, &sa.sin6_addr); puts("Connexion."); while (connect(s, (struct sockaddr *) &sa, sizeof sa) == -1) { perror("connect"); sleep(1); } char addr_pretty[INET6_ADDRSTRLEN] = ""; inet_ntop(AF_INET6, &(sa.sin6_addr), addr_pretty, sizeof addr_pretty); printf("Connecté à : %s\n", addr_pretty); return s; /* char buf[BUFSIZE]; */ /* ssize_t n; */ /* while (1) { */ /* n = read(in, buf, sizeof buf); */ /* if (n == -1) { */ /* perror("read"); */ /* exit(1); */ /* } */ /* n = write(s, buf, n); */ /* if (n == -1) { */ /* perror("write"); */ /* exit(1); */ /* } */ /* } */ /* close(s); */ } void ext_bidir(const char addr[], int port, int in, int out) { pid_t pid = fork(); if (pid == 0) { ext_in(addr, port); } else { ext_out(port); waitpid(pid, NULL, 0); } }