diff --git a/code/network/.gitignore b/code/network/.gitignore new file mode 100644 index 0000000..8dd1f93 --- /dev/null +++ b/code/network/.gitignore @@ -0,0 +1 @@ +emc-tnetd diff --git a/code/network/Makefile b/code/network/Makefile new file mode 100644 index 0000000..0c11fd8 --- /dev/null +++ b/code/network/Makefile @@ -0,0 +1,12 @@ +# +# NETWORK EXPERIMENTS +# + +COPT = -Wall -DDEBUG_LEVEL=1 -pthread + +# -------------------------------------------------- +# Experimental Specialized Telnet Server +# (Exemple Minimal Compilable) + +emc-tnetd: emc-tnetd.c Makefile + gcc $< $(COPT) -o $@ diff --git a/code/network/README.md b/code/network/README.md new file mode 100644 index 0000000..c94de57 --- /dev/null +++ b/code/network/README.md @@ -0,0 +1,15 @@ += Network / Réseau + +Some experiments on network programming. + +== Telnet server + +Une étude pour pouvoir intégrer un accès "console" à n'importe quelle +application. La première ébauche a rapidement permis de comprendre +que c'est pas si simple que ça. + +Le fichier `emc-tnetd.c` a mis en évidence deux soucis. +Sauras-tu les trouver ? + + + diff --git a/code/network/emc-tnetd.c b/code/network/emc-tnetd.c new file mode 100644 index 0000000..7ca4ece --- /dev/null +++ b/code/network/emc-tnetd.c @@ -0,0 +1,81 @@ +#include +#include +#include +#include +#include +#include +#include + +#define TL 20 + +int main(int argc, char *argv[]) +{ +int foo, len, sock; +char *adr_ip = "127.0.0.1"; +int port = 5678; +unsigned int addrlen; +int connected; +struct sockaddr_in addr; +struct in_addr ia; +FILE *fpin; +char line[TL+5], *ptr; + +fprintf(stderr, "--- %s ---\n", argv[0]); + +sock = socket(AF_INET, SOCK_STREAM, 0); +if (sock < 0) { + perror(__FILE__ " start socket"); + return -1; + } + +#define S sizeof(struct sockaddr_in) +memset(&addr, 0, S); +addr.sin_family = AF_INET; +addr.sin_port = htons(port); +if (adr_ip && inet_aton(adr_ip, &ia)) { + addr.sin_addr = ia; + fprintf(stderr, "attached to %s\n", adr_ip); + } +if ((foo=bind(sock, (struct sockaddr *)&addr, S)) < 0) { + perror(__FILE__ " fail on bind "); + close(sock); + return -2; + } +fprintf(stderr, "bind -> %d\n", foo); + +foo = listen(sock, 5); /* 5 is a bsd magic number */ +if (foo) { + perror(__FILE__ " no magic in listen "); + return -3; + } + +/* start of the endless loop */ +for (;;) { + fprintf(stderr, "accepting...\n"); + addrlen = sizeof(struct sockaddr); + connected = accept(sock, (struct sockaddr *)&addr, &addrlen); + if (connected < 0) { + perror(__FILE__ " accept"); + return -1; + } + fprintf(stderr, "accept -> %d\n", connected); + + if (NULL==(fpin = fdopen(connected, "r+"))) { + perror(__FILE__ " fdopen on connected"); + return -3; + } + // fprintf(stderr, "fopened...\n"); + + while ( (ptr=fgets(line, TL, fpin)) ) { + len = strlen(line); + fprintf(stderr, " %3d | %s", len, line); + for (foo=0; foo