Both sides previous revision
Poprzednia wersja
Nowa wersja
|
Poprzednia wersja
|
pl:dydaktyka:unix:lab_prog_siec [2016/12/15 17:55] kkutt poprawki w teorii, dodana sekcja z socketami w bashu |
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" |
| |
<WRAP center round info 60%> | |
Instrukcja poniżej jest w trakcie restrukturyzacji. Natomiast materiały do przygotowania, zamieszczone powyżej, nie zmienią się. Można więc już powoli się przygotowywać :-) | |
</WRAP> | |
| |
===== WPROWADZENIE ===== | ===== WPROWADZENIE ===== |
</file> | </file> |
| |
<file bash netscanner.sh> | <file bash port-scanner.sh> |
#!/bin/bash | #!/bin/bash |
| |
### | ### |
# Skaner portów (sprawdza które porty są otwarte). Jako argument wywołania podaj adres serwera, który chcesz przeskanować | # Skaner portów (sprawdza które porty są otwarte). |
| # Jako argument wywołania podaj adres serwera, który chcesz przeskanować, |
| # np. ./port-scanner.sh localhost |
### | ### |
| |
for ((port=$port_first; port<=$port_last; port++)) | for ((port=$port_first; port<=$port_last; port++)) |
do | do |
echo "Skanowanie portu $port..." | # echo "Skanowanie portu $port..." |
timeout 1 bash -c "(echo >/dev/tcp/$host/$port) >/dev/null 2>&1" && echo "$port otwarty!" | timeout 1 bash -c "(echo >/dev/tcp/$host/$port) >/dev/null 2>&1" && echo "$port otwarty!" |
done | done |
==== 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: |
| |
==== gethostbyname ==== | ==== gethostbyname ==== |
Przeanalizować, skompilować i uruchomić program: | - Proszę przeanalizować, skompilować i uruchomić program:<file c gethostbyname-demo.c> |
| |
<code c> | |
#include <stdio.h> | #include <stdio.h> |
#include <errno.h> | #include <errno.h> |
return 0; | return 0; |
} | } |
</code> | </file> |
* Sprawdzić działanie programu dla ''www.google.pl'' oraz innych wybranych adresów symbolicznych. | - Sprawdzić działanie programu dla ''<nowiki>www.yahoo.com</nowiki>'' oraz innych wybranych adresów symbolicznych. |
* Do powyższego kodu 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. |
| |
==== Komunikator ==== | ==== Serwer ==== |
Poniżej przedstawiony jest kod programu //server.c// | Poniżej przedstawiony jest kod programu //server.c// |
<code c> | <file c server.c> |
/* | /* |
** server.c -- a stream socket server demo | ** server.c -- a stream socket server demo |
} | } |
| |
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; |
} | } |
</code> | </file> |
| |
| === - 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). |
* //Podpowiedź// po akceptacji połączenia program powinien utworzyć dwa procesy potomne, jeden do czytania portu, drugi do pisania. | * 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. |
| |
==== Transfer plików ==== | === - Eternal vigilance == |
* Powyższy komunikator może być z łatwością zmodyfikowany aby zamiast tekstu wysyłał plik. | * Proszę zmodyfikować serwer tak, aby po obsłużeniu klienta nie kończył działania, ale powracał do oczekiwania na kolejne połączenie. |
* Zmodyfikować komunikator tak aby po nawiązaniu połączenia przez klienta rozpoczął wysyłanie pliku. | |
* Zmodyfikować program //client.c// tak aby był zdolny odebrać i zapisać przesyłany plik. | |
| |
==== Użycie Select ==== | |
| |
Patrz: | |
[[http://www.lowtek.com/sockets/select.html|The World of select()]] | |
| |
| === - Obsługa wielu klientów === |
| * Proszę zmodyfikować serwer tak, aby mógł obsługiwać jednocześnie więcej niż jednego klienta. |
| * Podpowiedź: Można użyć funkcji ''fork()'' do tworzenia procesów potomnych - każdy proces potomny będzie obsługiwał jednego klienta. |
| |
| |
* [[http://www.kohala.com/start/|W. Richard Stevens' Home Page]] | * [[http://www.kohala.com/start/|W. Richard Stevens' Home Page]] |
* BSD sockets | * BSD sockets |
http://www.frostbytes.com/~jimf/papers/sockets/sockets.html | * http://www.frostbytes.com/~jimf/papers/sockets/sockets.html |
http://www.lowtek.com/sockets/ | * http://www.lowtek.com/sockets/ |
http://beej.us/guide/bgnet/ | * http://beej.us/guide/bgnet/ |
http://www.uwo.ca/its/doc/courses/notes/socket/ | * http://www.uwo.ca/its/doc/courses/notes/socket/ |
http://gaia.cs.umass.edu/ntu_socket/ | * http://gaia.cs.umass.edu/ntu_socket/ |
http://www.devdaily.com/Dir/Unix/Socket_Programming/ | * http://www.devdaily.com/Dir/Unix/Socket_Programming/ |
http://www.unl.csi.cuny.edu/faqs/sock-faq/html/unix-socket-faq.html | * http://www.unl.csi.cuny.edu/faqs/sock-faq/html/unix-socket-faq.html |
http://www.ibm.com/developerworks/linux/library/l-sockpit/ | * http://www.ibm.com/developerworks/linux/library/l-sockpit/ |
| |
* OpenSSL | * OpenSSL |
http://www.ibm.com/developerworks/linux/library/l-openssl.html | * http://www.ibm.com/developerworks/linux/library/l-openssl.html |
http://www.ibm.com/developerworks/linux/library/l-openssl2.html | * http://www.ibm.com/developerworks/linux/library/l-openssl2.html |
http://www.ibm.com/developerworks/linux/library/l-openssl3.html | * http://www.ibm.com/developerworks/linux/library/l-openssl3.html |
http://www.ibm.com/developerworks/linux/library/l-hisock.html | * http://www.ibm.com/developerworks/linux/library/l-hisock.html |
| |
* TCP/IP | * TCP/IP |
http://userpages.umbc.edu/~jeehye/cmsc491b/lectures/tcpstate/sld001.htm | * http://userpages.umbc.edu/~jeehye/cmsc491b/lectures/tcpstate/sld001.htm |
http://www.tcpipguide.com/free/ | * http://www.tcpipguide.com/free/ |
http://www.ipprimer.com/overview.cfm | * http://www.ipprimer.com/overview.cfm |
http://www.linux-tutorial.info/modules.php?name=MContent&obj=page&pageid=142 | * http://www.linux-tutorial.info/modules.php?name=MContent&obj=page&pageid=142 |
| |
| * Użycie Select |
| * [[http://www.lowtek.com/sockets/select.html|The World of select()]] |
| |