diff --git a/Readme.md b/Readme.md index 0d86e02fa00bb7c0d5a0ebed194aeb5d84c5abe4..410b7a58ac2f687ca0b664bdcac500c6630cc4f3 100644 --- a/Readme.md +++ b/Readme.md @@ -5,6 +5,69 @@ getaddrinfo connect +<!-- include (client.c lang=c) --> +```c +# include "die.h" +# include <sys/types.h> +# include <sys/socket.h> +# include <netdb.h> +# include <stdio.h> +# include <unistd.h> + +int main() { + char *url = "www.fau.de"; + char *port = "80"; + struct addrinfo hints = + { + .ai_socktype = SOCK_STREAM, // Nur TCP-Sockets + .ai_family = AF_UNSPEC, // Beliebige Adressfamilie + .ai_flags = AI_ADDRCONFIG, // Nur Adresstypen für die auch ein lokales Interface existiert + }; // C: alle anderen Elemente der Struktur werden implizit genullt + + struct addrinfo *head; + int res = getaddrinfo(url, port, &hints, &head); + if(res) die_m(gai_strerror(res)); + + // Liste der Adressen durchtesten + int sock; + struct addrinfo *curr; + for (curr = head; curr != NULL; curr = curr->ai_next) { + sock = socket(curr->ai_family, curr->ai_socktype, curr->ai_protocol); + if(sock == -1) {// Fehlerbehandlung + continue; + } + if (connect(sock, curr->ai_addr, curr->ai_addrlen) == 0) + break; + close(sock); + } + freeaddrinfo(head); + if (curr == NULL) die_m("Could not connect to server"); + + FILE *rx, *tx; + if( (rx = fdopen(sock, "r")) == NULL) die("fdopen"); + int sock_copy = dup(sock); + if(sock_copy < 0) die("dup"); + if( (tx = fdopen(sock_copy, "w")) == NULL ) die("fdopen"); + + //test it + fprintf(tx, "GET http://www.fau.de/index.html HTTP/1.1\r\n\r\n"); + fflush(tx); + char *lineptr = NULL; + size_t lineSize = 0; + ssize_t strLen = 0; + strLen = getline(&lineptr, &lineSize, rx); + if(strLen < 0) { + if(ferror(rx)) die("getline"); + } + printf("%s\n", lineptr); + free(lineptr); + + if(fclose(rx)) perror("fclose"); + if(fclose(tx)) perror("fclose"); +} +``` +<!-- /include --> + ### server listen accept diff --git a/Zettel.html b/Zettel.html index c360d2eb7207dbcaf60a2452448e9362c96cc12f..8f12c4d028a9dd4c13a8ebce650bd229db86acb6 100644 --- a/Zettel.html +++ b/Zettel.html @@ -3,6 +3,67 @@ <h3>client</h3> <p>getaddrinfo connect</p> +<p><!-- include (client.c lang=c) --></p> +<pre><code class="hljs language-c"><span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string">"die.h"</span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><sys/types.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><sys/socket.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><netdb.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><stdio.h></span></span> +<span class="hljs-meta"># <span class="hljs-meta-keyword">include</span> <span class="hljs-meta-string"><unistd.h></span></span> + +<span class="hljs-function"><span class="hljs-keyword">int</span> <span class="hljs-title">main</span><span class="hljs-params">()</span> </span>{ + <span class="hljs-keyword">char</span> *url = <span class="hljs-string">"www.fau.de"</span>; + <span class="hljs-keyword">char</span> *port = <span class="hljs-string">"80"</span>; + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">addrinfo</span> <span class="hljs-title">hints</span> = + {</span> + .ai_socktype = SOCK_STREAM, <span class="hljs-comment">// Nur TCP-Sockets</span> + .ai_family = AF_UNSPEC, <span class="hljs-comment">// Beliebige Adressfamilie</span> + .ai_flags = AI_ADDRCONFIG, <span class="hljs-comment">// Nur Adresstypen für die auch ein lokales Interface existiert</span> + }; <span class="hljs-comment">// C: alle anderen Elemente der Struktur werden implizit genullt</span> + + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">addrinfo</span> *<span class="hljs-title">head</span>;</span> + <span class="hljs-keyword">int</span> res = getaddrinfo(url, port, &hints, &head); + <span class="hljs-keyword">if</span>(res) die_m(gai_strerror(res)); + + <span class="hljs-comment">// Liste der Adressen durchtesten</span> + <span class="hljs-keyword">int</span> sock; + <span class="hljs-class"><span class="hljs-keyword">struct</span> <span class="hljs-title">addrinfo</span> *<span class="hljs-title">curr</span>;</span> + <span class="hljs-keyword">for</span> (curr = head; curr != <span class="hljs-literal">NULL</span>; curr = curr->ai_next) { + sock = socket(curr->ai_family, curr->ai_socktype, curr->ai_protocol); + <span class="hljs-keyword">if</span>(sock == <span class="hljs-number">-1</span>) {<span class="hljs-comment">// Fehlerbehandlung</span> + <span class="hljs-keyword">continue</span>; + } + <span class="hljs-keyword">if</span> (<span class="hljs-built_in">connect</span>(sock, curr->ai_addr, curr->ai_addrlen) == <span class="hljs-number">0</span>) + <span class="hljs-keyword">break</span>; + <span class="hljs-built_in">close</span>(sock); + } + freeaddrinfo(head); + <span class="hljs-keyword">if</span> (curr == <span class="hljs-literal">NULL</span>) die_m(<span class="hljs-string">"Could not connect to server"</span>); + + FILE *rx, *tx; + <span class="hljs-keyword">if</span>( (rx = fdopen(sock, <span class="hljs-string">"r"</span>)) == <span class="hljs-literal">NULL</span>) die(<span class="hljs-string">"fdopen"</span>); + <span class="hljs-keyword">int</span> sock_copy = dup(sock); + <span class="hljs-keyword">if</span>(sock_copy < <span class="hljs-number">0</span>) die(<span class="hljs-string">"dup"</span>); + <span class="hljs-keyword">if</span>( (tx = fdopen(sock_copy, <span class="hljs-string">"w"</span>)) == <span class="hljs-literal">NULL</span> ) die(<span class="hljs-string">"fdopen"</span>); + + <span class="hljs-comment">//test it</span> + <span class="hljs-built_in">fprintf</span>(tx, <span class="hljs-string">"GET http://www.fau.de/index.html HTTP/1.1\r\n\r\n"</span>); + fflush(tx); + <span class="hljs-keyword">char</span> *lineptr = <span class="hljs-literal">NULL</span>; + <span class="hljs-keyword">size_t</span> lineSize = <span class="hljs-number">0</span>; + <span class="hljs-keyword">ssize_t</span> strLen = <span class="hljs-number">0</span>; + strLen = getline(&lineptr, &lineSize, rx); + <span class="hljs-keyword">if</span>(strLen < <span class="hljs-number">0</span>) { + <span class="hljs-keyword">if</span>(ferror(rx)) die(<span class="hljs-string">"getline"</span>); + } + <span class="hljs-built_in">printf</span>(<span class="hljs-string">"%s\n"</span>, lineptr); + <span class="hljs-built_in">free</span>(lineptr); + + <span class="hljs-keyword">if</span>(fclose(rx)) perror(<span class="hljs-string">"fclose"</span>); + <span class="hljs-keyword">if</span>(fclose(tx)) perror(<span class="hljs-string">"fclose"</span>); +} +</code></pre> +<p><!-- /include --></p> <h3>server</h3> <p>listen accept</p> diff --git a/Zettel.md b/Zettel.md index 657e601c40515244ac8f9058723e0faf6bcd1447..fe746186c38784b488641318bc803942e9e48f66 100644 --- a/Zettel.md +++ b/Zettel.md @@ -5,6 +5,8 @@ getaddrinfo connect +!include(client.c lang=c) + ### server listen accept diff --git a/client.c b/client.c new file mode 100644 index 0000000000000000000000000000000000000000..162fdbca3b27e1949ad756c9db4a8404751f47c8 --- /dev/null +++ b/client.c @@ -0,0 +1,58 @@ +#include "die.h" +#include <sys/types.h> +#include <sys/socket.h> +#include <netdb.h> +#include <stdio.h> +#include <unistd.h> + +int main() { + char *url = "www.fau.de"; + char *port = "80"; + struct addrinfo hints = + { + .ai_socktype = SOCK_STREAM, // Nur TCP-Sockets + .ai_family = AF_UNSPEC, // Beliebige Adressfamilie + .ai_flags = AI_ADDRCONFIG, // Nur Adresstypen für die auch ein lokales Interface existiert + }; // C: alle anderen Elemente der Struktur werden implizit genullt + + struct addrinfo *head; + int res = getaddrinfo(url, port, &hints, &head); + if(res) die_m(gai_strerror(res)); + + // Liste der Adressen durchtesten + int sock; + struct addrinfo *curr; + for (curr = head; curr != NULL; curr = curr->ai_next) { + sock = socket(curr->ai_family, curr->ai_socktype, curr->ai_protocol); + if(sock == -1) {// Fehlerbehandlung + continue; + } + if (connect(sock, curr->ai_addr, curr->ai_addrlen) == 0) + break; + close(sock); + } + freeaddrinfo(head); + if (curr == NULL) die_m("Could not connect to server"); + + FILE *rx, *tx; + if( (rx = fdopen(sock, "r")) == NULL) die("fdopen"); + int sock_copy = dup(sock); + if(sock_copy < 0) die("dup"); + if( (tx = fdopen(sock_copy, "w")) == NULL ) die("fdopen"); + + //test it + fprintf(tx, "GET http://www.fau.de/index.html HTTP/1.1\r\n\r\n"); + fflush(tx); + char *lineptr = NULL; + size_t lineSize = 0; + ssize_t strLen = 0; + strLen = getline(&lineptr, &lineSize, rx); + if(strLen < 0) { + if(ferror(rx)) die("getline"); + } + printf("%s\n", lineptr); + free(lineptr); + + if(fclose(rx)) perror("fclose"); + if(fclose(tx)) perror("fclose"); +}