Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:unix:lab_prog_siec [2016/12/15 18:11] kkutt Poprawiona sekcja Serwer |
pl:dydaktyka:unix:lab_prog_siec [2019/06/27 15:50] (aktualna) |
===== DO PRZYGOTOWANIA ===== | ===== DO PRZYGOTOWANIA ===== |
* Proszę przypomnieć sobie użycie ''[[http://home.agh.edu.pl/~gjn/dydaktyka/UGLX/node11.html#SECTION000117000000000000000|fork()]]'' | * Proszę przypomnieć sobie użycie ''[[http://home.agh.edu.pl/~gjn/dydaktyka/UGLX/node11.html#SECTION000117000000000000000|fork()]]'' |
* Proszę poczytać [[http://www.linuxpl.org/LPG/node81.html|opis podstaw gniazd sieciowych (socketów)]] | * Proszę poczytać opis podstaw gniazd sieciowych (socketów) z [[https://web.archive.org/web/20170405054449/http://www.linuxpl.org/LPG/node1.html|The Linux Programmer's Guide]]. Konkretnie sekcję [[https://web.archive.org/web/20170305021856/http://www.linuxpl.org:80/LPG/node81.html|Gniazda sieciowe - podstawy]] oraz jej podsekcje: "Podstawowe funkcje", "TCP: SOCK_STREAM", "SOCK_DGRAM (UDP)", "PF_UNIX", "SOCK_RAW i PF_PACKET" |
| |
===== WPROWADZENIE ===== | ===== WPROWADZENIE ===== |
==== Programowanie gniazd ==== | ==== Programowanie gniazd ==== |
Przeglądnąć artykuł: | Przeglądnąć artykuł: |
[[http://beej.us/guide/bgnet/output/html/singlepage/bgnet.html|Beej's Guide to Network Programming]] | [[http://beej.us/guide/bgnet/html/single/bgnet.html|Beej's Guide to Network Programming]] |
| |
Skompilować i przetestować omówione w nim programy, w tym: | Skompilować i przetestować omówione w nim programy, w tym: |
} | } |
</file> | </file> |
- Sprawdzić działanie programu dla ''www.google.com'' oraz innych wybranych adresów symbolicznych. | - Sprawdzić działanie programu dla ''<nowiki>www.yahoo.com</nowiki>'' oraz innych wybranych adresów symbolicznych. |
- Dopisać instrukcje, które szczegółowo sprawdzają typ błędu funkcji ''gethostbyname'' i w zależności od tego wyświetlają odpowiedni komunikat. | - Dopisać instrukcje, które szczegółowo sprawdzają typ błędu funkcji ''gethostbyname'' i w zależności od tego wyświetlają odpowiedni komunikat. |
- Zmodyfikować tak program aby wyświetlał wszystkie adresy IP odnoszące się do podanego adresu. | - Zmodyfikować tak program aby wyświetlał wszystkie adresy IP odnoszące się do podanego adresu. |
} | } |
| |
while(1) { // main accept() loop | sin_size = sizeof their_addr; |
sin_size = sizeof their_addr; | if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { |
if ((new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size)) == -1) { | perror("accept"); |
perror("accept"); | |
continue; | |
} | |
printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr)); | |
if (!fork()) { // this is the child process | |
close(sockfd); // child doesn't need the listener | |
if (send(new_fd, "Hello, world!\n", 14, 0) == -1) | |
perror("send"); | |
close(new_fd); | |
exit(0); | |
} | |
close(new_fd); // parent doesn't need this | |
} | } |
| printf("server: got connection from %s\n",inet_ntoa(their_addr.sin_addr)); |
| if (send(new_fd, "Hello, world!\n", 14, 0) == -1) |
| perror("send"); |
| sleep(5); // just for observing easily that the server cannot serve a few clients concurrently |
| close(new_fd); |
| |
return 0; | return 0; |
} | } |
=== - Komunikator === | === - Komunikator === |
* Należy przerobić powyższy program tak aby działał jako server. Łącząc się za pomocą np. programu //telnet// program powinien umożliwiać prowadzenie dialogu jak popularne komunikatory internetowe (np. gg, tlen, itp). | * Należy przerobić powyższy program tak aby działał jako server. Łącząc się za pomocą np. programu //telnet// program powinien umożliwiać prowadzenie dialogu jak popularne komunikatory internetowe (np. gg, tlen, itp). |
| * Korzystając z programu telnet można połączyć się z serwerem wpisując: <code sh>$ telnet remotehostname XXX</code> gdzie ''remotehostname'' jest nazwą komputera, na którym uruchomiono serwer (''localhost'', jeżeli to ta sama maszyna), a ''XXX'' numerem przypisanego do niego portu. |
* Podpowiedź: po akceptacji połączenia program powinien utworzyć dwa procesy potomne, jeden do czytania portu, drugi do pisania. | * Podpowiedź: po akceptacji połączenia program powinien utworzyć dwa procesy potomne, jeden do czytania portu, drugi do pisania. |
| |