[ Pobierz całość w formacie PDF ]
Beej’s Guide to Network Programming
Uzywanie gniazd internetowych
Brian "Beej" Hall
beej@piratehaven.org
Bartosz Zapałowski
bartek@klepisko.eu.org
Copyright © 1995-2001 Brian "Beej" Hall
Historia zmian
Zmiana Wersja 1.0.0 Sierpie n, 1995
Revised by: beej
Pierwsza wersja.
Zmiana Wersja 1.5.5 13 Stycze n, 1999
Revised by: beej
Ostatnia wersja HTML.
Zmiana Wersja 2.0.0 6 Marzec, 2001 Revised by: beej
Przekonwertowane do formatu DocBook XML, poprawki, dodatki.
Zmiana Wersja 2.3.1 8 Pazdziernik, 2001 Revised by: beej
Poprawione literówki, bł edy składniowe w client.c, dodane par e rzeczy w seckji FAQ.
Spis tre sci
1. Wprowadzenie ...........................................................................................................................................................3
1.1. Dla kogo? .......................................................................................................................................................3
1.2. Platforma i kompilator ...................................................................................................................................3
1.3. Oficjalna strona główna..................................................................................................................................3
1.4. Uwagi dla programistów Solaris/SunOS........................................................................................................3
1.5. Uwagi dla programistów Windows ................................................................................................................4
1.6. Zanim do mnie napiszesz ...............................................................................................................................5
1.7. Tworzenie mirrorów strony ............................................................................................................................5
1.8. Uwagi dla tłumaczy........................................................................................................................................5
1.9. Prawa autorskie i dystrybucja.........................................................................................................................5
2. Co to jest gniazdo? ....................................................................................................................................................6
2.1. Dwa typy gniazd internetowych .....................................................................................................................6
2.2. Niskopoziomowy nonsense a teoria sieci.......................................................................................................7
3.
struct
ury i przetwarzanie danych.........................................................................................................................9
3.1. Zmiana reprezentacji bajtów ........................................................................................................................10
3.2. Adresy IP oraz jak sobie z nimi radzic.........................................................................................................11
4. Wywołania systemowe ............................................................................................................................................12
4.1.
socket()
-- Daj deskryptor pliku!..............................................................................................................12
4.2.
bind()
-- Na jakim jestem porcie? .............................................................................................................13
4.3.
connect()
-- Ej, ty!....................................................................................................................................15
4.4.
listen()
-- Prosze dzwonic.......................................................................................................................16
4.5.
accept()
-- "Dziekujemy za wybranie portu 3490." .................................................................................17
4.6.
send()
i
recv()
-- Mów do mnie, Misiu! .................................................................................................18
4.7.
sendto()
i
recvfrom()
-- Mów do mnie w stylu DGRAM ....................................................................19
4.8.
close()
i
shutdown()
-- Wynocha! .........................................................................................................20
4.9.
getpeername()
-- Kim jestes? ..................................................................................................................21
4.10.
gethostname()
-- Kim ja jestem? ...........................................................................................................21
4.11. DNS -- Mówisz "whitehouse.gov", odpowiadam "198.137.240.92" .........................................................22
5. Tło Klient-Serwer....................................................................................................................................................23
5.1. Prosty strumieniowy serwer .........................................................................................................................24
5.2. Prosty strumieniowy klient...........................................................................................................................26
5.3. Gniazda datagramowe ..................................................................................................................................27
6. Troche zaawansowane techniki..............................................................................................................................30
6.1. Blokowanie...................................................................................................................................................30
6.2.
select()
-- Zsynchronizowane wielokrotne operacje I/O.........................................................................31
6.3. Radzenie sobie z niepełnym wysyłaniem.....................................................................................................36
6.4. Enkapsulacja danych ....................................................................................................................................37
7. Wiecej informacji ....................................................................................................................................................39
7.1.
man
Pages ....................................................................................................................................................39
7.2. Ksi azki..........................................................................................................................................................40
7.3. W sieci..........................................................................................................................................................41
7.4. Dokumenty RFC ..........................................................................................................................................41
8. FAQ...........................................................................................................................................................................42
9. Wołanie o pomoc .....................................................................................................................................................47
1. Wprowadzenie
Czesc! Programowanie gniazd zwala Cie z nóg? Czy jest to zbyt trudne do nauczenia ze stron
man
a? Chcesz pisac
programy Internetowe, ale nie masz czasu na szperanie pomiedzy
struct
urami aby sie dowiedziec czy najpierw
muszisz uzyc
bind()
a zanim sie poł aczysz (
connect()
) itp.
Hmm, zgadnij co! Własnie wykonałem t a brudn a robote i umieram z checi podzielenia sie t a informacj a ze
wszystkimi. Jestes w dobrym miejscu. Ten dokument powinien dac przecietnemu programiscie C informacji, których
potrzebuje aby uporac sie z sieciowym brudem.
1.1. Dla kogo?
Ten dokument został napisany jako przewodnik, nie jako zródło informacji. Jest chyba najlepszy dla osób, które
dopiero zaczynaj a programowanie gniazd i szukaj a wsparcia. Z cał a pewnosci a nie jest to
kompletny
przewodnik do
programowania gniazd.
Pełen nadzieji mysle, ze bedzie to wystarczaj aca dla podreczników mana, by nabrały one sensu...
:-)
1.2. Platforma i kompilator
Kod zawarty w tym dokumencie był kompilowany na Linux PC uzywaj ac kompilatora GNU
gcc
. Jednak powinien
sie on skompilowac na kazdej platformie uzywaj acej
gcc
. Oczywiscie nie dotyczy to sytuacji, gdy programujesz w
Windows -- przeczytaj sekcje dla programistów Windows.
1.3. Oficjalna strona główna
Oficjalna strona główna tego dokumentu w oryginale miesci sie na serwerze California State University, Chicho pod
adresem
http://www.ecst.csuchico.edu/~beej/guide/net/
.
1.4. Uwagi dla programistów Solaris/SunOS
Kompiluj ac dla Solaris/SunOS, muszisz zdefiniowac kilka dodatkowych przeł aczników w lini komend aby
zlinkowac dla poprawnych bibliotek. Aby to zrobic po prostu dodaj "
-lnsl -lsocket -lresolv
" na ko ncu
polecenia kompilacji, np.:
$
cc -o server server.c -lnsl -lsocket -lresolv
Jesli nadal otrzymujesz błedy spróbuj jeszcze dodac "
-lxnet
" na ko ncu tego polecenia. Nie wiem co to daje
dokładnie, ale niektórzy ludzie tego potrzebuj a.
Kolejnym miejscem sprawiaj acym problemy jest wywołanie
setsockopt()
. Prototyp tej funkcji rózni sie od tej na
moim Linuksie, wiec zamiast:
int yes=1;
3
Beej’s Guide to Network Programming
wpisz to:
char yes=’1’;
Poniewaz nie mam systemu SunOS, wiec nie testowałem zadnej z powyzszył informacji -- to jest tylko to, co ludzie
mi powiedzieli poprzez emaila.
1.5. Uwagi dla programistów Windows
Nie za bardzo lubie Windows - namawiam Cie do spróbowania systemu Linux, BSD lub Unix. Jednak mozesz
uzywac informacji zawartych w tym dokumencie równiez pod Windows.
Po pierwsze - zignoruj spor a ilosc wszystkich nagłówków systemowych, których tu uzyłem. Wszystko, co musisz
doł aczyc to:
#include <winsock.h>
Czekaj! Musisz równiez zrobic wywołanie do funkcji
WSAStartup()
zanim cokolwiek bedziesz chciał zrobic przy
uzyciu biblioteki gniazd. Kod do tego celu wygl ada mniej wiecej tak:
#include <winsock.h>
{
WSADATA wsaData; // jesli to nie zadziała
//WSAData wsaData; // uzyj tego
if (WSAStartup(MAKEWORD(1, 1), &wsaData) != 0) {
fprintf(stderr, "WSAStartup failed.\n");
exit(1);
}
Musisz równiez powiedziec kompilatorowi, zeby zlinkował program z bibliotek a Winsock, zazwyczaj nazywanej
wsock32.lib
lub
winsock32.lib
lub cos w tym stylu. Uzywaj ac Visual C++, powyzsza czynnosc moze byc
wykonana poprzez menu
Project
pod opcj a
Settings
. Kliknij zakładke
Link
i odszukaj "Object/library
modules". Dodaj "wsock32.lib" do tej listy.
W ko ncu, musisz wywołac
WSACleanup()
, gdy juz sko nczysz prace z bibliotek a gniazd. Zobacz pomoc on-line,
jesli chcesz znac szczegóły.
Jak juz to zrobisz, reszta przykładów w tym przewodniku powinna działac z pewnymi wyj atkami. Po pierwsze - nie
mozesz uzywac
close()
do zamykania gniazd--zamiast tego musisz uzyc
closesocket()
. Równiez,
select()
działa tylko z deskryptorami gniazd, nie deskryptorami plików (takich jak
0
dla
stdin
).
Jest równiez klasa gniazd, której mozesz uzyc -
CSocket
. Sprawdz strony pomocy swojego kompilatora, by uzyskac
wiecej informacji.
Aby uzyskac wiecej informacji o Winsock, przeczytaj Winsock FAQ
2
.
W ko ncu, słyszałem, ze Windows nie ma funkcji
fork()
, która jest uzywana w kilku przykładach. Moze musisz
zlinkowac z bibliotek a POSIX lub czyms, zeby to działało. Mozesz tez uzyc
CreateProccess()
w zamian.
4
Beej’s Guide to Network Programming
fork()
nie bierze zadnych argumentów, a
CreateProcess()
wymaga około 48 bilionów argumentów ;-). Jesli nie
potrzebujesz takiej funkcji,
CreateThread()
jest troche prostsza do strawienia... Niestety, dyskusja o
wielow atkowosci wychodzi poza ramy tego dokumentu. Witaj we wspaniałym swiecie programowania pod Win32.
1.6. Zanim do mnie napiszesz
Generalnie jestem gotowy by odpowiadac na pytania w emailach, wiec mozesz spokojnie pisac, ale nie moge
zagwarantowac odpowiedzi. Prowadze bardzo zajete zycie i s a takie chwile, ze po prostu nie moge udzielic
odpowiedzi. Kiedy tak sie dzieje, zazwyczaj usuwam wiadomosc. Nie bierz tego do siebie; Po prostu wiem, ze nie
bede miał czasu, by udzielic Ci szczegółowej odpowiedzi.
Z reguły im bardziej skomplikowanie jest pytanie tym mniejsze szanse na to, ze bede w stanie odpowiedziec. Jesli
dokładnie napiszesz o co Ci chodzi oraz zał aczysz wazne informacje (takie jak platforma, kompilator, błedy jakie
otrzymujesz i wszystko inne co mogłoby mi pomóc w znalezieniu rozwi azania) wtedy masz wieksze szanse na
otrzymanie odpowiedzi. Po wiecej szczegółów przeczytaj dokument ESR, Jak m adrze zadawac pytania
3
.
Jesli jednak jej nie otrzymasz, skup sie nad swoim problemem, spróbuj sam uzyskac odpowiedz, i jesli nadal
problem bedzie wystepował napisz ponownie doł aczaj ac informacje, które uzyskałes i miejmy nadzieje, ze to mi
wystarczy by Ci pomóc.
Teraz jak Cie nauczyłem jak do mnie pisac (;-)), chciałbym powiedziec, ze z
pełnym
szacunkiem odnosze sie do
wartosci jak a uzyskał ten przewodnik w ci agu lat. To jest prawdziwy kop moralny, i cieszy mnie to, ze jest on
uwazany za dobry!
:)
Dziekuje!
1.7. Tworzenie mirrorów strony
Mozesz smiało mirrorowac t a strone, dla celów publicznych lub prywatnych. Jesli mirrorujesz dla celów publicznych
i chcesz, zebym umiescił link to tej strony na stronie głównej, napisz do mnie <
beej@piratehaven.org
>.
1.8. Uwagi dla tłumaczy
Jesli chcesz przetłumaczyc ten przewodnik na inny jezyk, napisz do mnie <
beej@piratehaven.org
> a ja zrobie
link na stronie głównej do twojego tłumaczenia.
Nie krepuj sie by dodac swoje nazwisko i adres email do tłumaczenia.
Przykro mi, ale z powodu przestrzeni dyskowej, nie moge hostowac tłumacze n.
1.9. Prawa autorskie i dystrybucja
Beej’s Guide to Network Programming is Copyright © 1995-2001 Brian "Beej" Hall.
Ten przewodnik moze byc dowolnie przedrukowywany w kazdym medium pod warunkiem, ze nie jest on zmieniony
i jest prezentowany w całosci.
5
[ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • amelia.pev.pl