#define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include void ext_out(int port) { int server = socket(AF_INET6, SOCK_STREAM, 0); if (server == -1) { perror("socket"); exit(1); } 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, SOMAXCONN) == -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); 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); char buf[1024]; while (1) { ssize_t n = read(client, buf, sizeof buf); write(1, buf, n); } close(client); close(server); } void ext_in(const char addr[], int port, int in) { 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."); if (connect(s, (struct sockaddr *) &sa, sizeof sa) == -1) { perror("connect"); exit(1); } char addr_pretty[INET6_ADDRSTRLEN] = ""; inet_ntop(AF_INET6, &(sa.sin6_addr), addr_pretty, sizeof addr_pretty); printf("Connecté à : %s\n", addr_pretty); char buf[1024]; while (1) { ssize_t 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); }