Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?
Autor: Brian 'Beej' Hall <beej@piratehaven.org>
Tłumaczenie: Bartosz Zapałowski <bartek@klepisko.eu.org>
Biblioteki C++

Wprowadzenie

[lekcja] Rozdział 1. Wprowadzenie do programowania sieciowego.
Cześć! Programowanie gniazd zwala Cię z nóg? Czy jest to zbyt trudne do nauczenia ze stron mana? Chcesz pisać programy Internetowe, ale nie masz czasu na szperanie pomiędzy structurami aby się dowiedzieć czy najpierw muszisz użyć bind()a zanim się połączysz (connect()) itp.

Hmm, zgadnij co! Właśnie wykonałem tą brudną robotę i umieram z chęci podzielenia się tą informacją ze wszystkimi. Jesteś w dobrym miejscu. Ten dokument powinien dać przeciętnemu programiście C informacji, których potrzebuje aby uporać się z sieciowym brudem.

Dla kogo?

Ten dokument został napisany jako przewodnik, nie jako źródło informacji. Jest chyba najlepszy dla osób, które dopiero zaczynają programowanie gniazd i szukają wsparcia. Z całą pewnością nie jest to kompletny przewodnik do programowania gniazd.

Pełen nadzieji myślę, że będzie to wystarczająca dla podręczników mana, by nabrały one sensu... :-)

Platforma i kompilator

Kod zawarty w tym dokumencie był kompilowany na Linux PC używając kompilatora GNU gcc. Jednak powinien się on skompilować na każdej platformie używającej gcc. Oczywiście nie dotyczy to sytuacji, gdy programujesz w Windows -- przeczytaj sekcję dla programistów Windows.

Oficjalna strona główna

Oficjalna strona główna tego dokumentu w oryginale mieści się na serwerze California State University, Chicho pod adresem http://www.ecst.csuchico.edu/~beej/guide/net/.

Uwagi dla programistów Solaris/SunOS

Kompilując dla Solaris/SunOS, muszisz zdefiniować kilka dodatkowych przełączników w lini komend aby zlinkować dla poprawnych bibliotek. Aby to zrobić po prostu dodaj "-lnsl -lsocket -lresolv" na końcu polecenia kompilacji, np.:
$ cc -o server server.c -lnsl -lsocket -lresolv
Jeśli nadal otrzymujesz błędy spróbuj jeszcze dodać "-lxnet" na końcu tego polecenia. Nie wiem co to daje dokładnie, ale niektórzy ludzie tego potrzebują.

Kolejnym miejscem sprawiającym problemy jest wywołanie setsockopt(). Prototyp tej funkcji różni się od tej na moim Linuksie, więc zamiast:
C/C++
int yes = 1;

wpisz to:
C/C++
char yes = '1';
Ponieważ nie mam systemu SunOS, więc nie testowałem żadnej z powyższył informacji -- to jest tylko to, co ludzie mi powiedzieli poprzez emaila.

Uwagi dla programistów Windows

Nie za bardzo lubię Windows - namawiam Cię do spróbowania systemu Linux, BSD lub Unix. Jednak możesz używać informacji zawartych w tym dokumencie również pod Windows.

Po pierwsze - zignoruj sporą ilość wszystkich nagłówków systemowych, których tu użyłem. Wszystko, co musisz dołączyć to:
C/C++
#include <winsock.h>
Czekaj! Musisz również zrobić wywołanie do funkcji WSAStartup() zanim cokolwiek będziesz chciał zrobić przy użyciu biblioteki gniazd. Kod do tego celu wygląda mniej więcej tak:
C/C++
#include <winsock.h>

int main()
{
    WSADATA wsaData; // jeśli to nie zadziała
    //WSAData wsaData; // użyj tego
   
    if( WSAStartup( MAKEWORD( 1, 1 ), & wsaData ) != 0 )
    {
        fprintf( stderr, "WSAStartup failed.\n" );
        exit( 1 );
    }
    //Tu dalsza część programu
    return 0;
}
Musisz również powiedzieć kompilatorowi, żeby zlinkował program z biblioteką Winsock, zazwyczaj nazywanej wsock32.lib lub winsock32.lib lub coś w tym stylu. Używając Visual C++, powyższa czynność może być wykonana poprzez menu Project pod opcją Settings. Kliknij zakładkę Link i odszukaj "Object/library modules". Dodaj "wsock32.lib" do tej listy.

W końcu, musisz wywołać WSACleanup(), gdy już skończysz pracę z biblioteką gniazd. Zobacz pomoc on-line, jeśli chcesz znać szczegóły.

Jak już to zrobisz, reszta przykładów w tym przewodniku powinna działać z pewnymi wyjątkami. Po pierwsze - nie możesz używać close() do zamykania gniazd--zamiast tego musisz użyć closesocket(). Również, select() działa tylko z deskryptorami gniazd, nie deskryptorami plików (takich jak 0 dla stdin).

Jest również klasa gniazd, której możesz użyć - CSocket. Sprawdź strony pomocy swojego kompilatora, by uzyskać więcej informacji.

Aby uzyskać więcej informacji o Winsock, przeczytaj Winsock FAQ.

W końcu, słyszałem, że Windows nie ma funkcji fork(), która jest używana w kilku przykładach. Może musisz zlinkować z biblioteką POSIX lub czymś, żeby to działało. Możesz też użyć CreateProccess() w zamian. fork() nie bierze żadnych argumentów, a CreateProcess() wymaga około 48 bilionów argumentów ;-). Jeśli nie potrzebujesz takiej funkcji, CreateThread() jest trochę prostsza do strawienia... Niestety, dyskusja o wielowątkowości wychodzi poza ramy tego dokumentu. Witaj we wspaniałym świecie programowania pod Win32.

Zanim do mnie napiszesz

Generalnie jestem gotowy by odpowiadać na pytania w emailach, więc możesz spokojnie pisać, ale nie mogę zagwarantować odpowiedzi. Prowadzę bardzo zajęte życie i są takie chwile, że po prostu nie mogę udzielić odpowiedzi. Kiedy tak się dzieje, zazwyczaj usuwam wiadomość. Nie bierz tego do siebie; Po prostu wiem, że nie będę miał czasu, by udzielić Ci szczegółowej odpowiedzi.

Z reguły im bardziej skomplikowanie jest pytanie tym mniejsze szanse na to, że będę w stanie odpowiedzieć. Jeśli dokładnie napiszesz o co Ci chodzi oraz załączysz ważne informacje (takie jak platforma, kompilator, błędy jakie otrzymujesz i wszystko inne co mogłoby mi pomóc w znalezieniu rozwiązania) wtedy masz większe szanse na otrzymanie odpowiedzi.

Jeśli jednak jej nie otrzymasz, skup się nad swoim problemem, spróbuj sam uzyskać odpowiedź, i jeśli nadal problem będzie występował napisz ponownie dołączając informacje, które uzyskałeś i miejmy nadzieję, że to mi wystarczy by Ci pomóc.

Teraz jak Cie nauczyłem jak do mnie pisać (;-)), chciałbym powiedzieć, że z pełnym szacunkiem odnoszę się do wartości jaką uzyskał ten przewodnik w ciągu lat. To jest prawdziwy kop moralny, i cieszy mnie to, że jest on uważany za dobry! :) Dziękuję!

Tworzenie mirrorów strony

Możesz śmiało mirrorować tą stronę, dla celów publicznych lub prywatnych. Jeśli mirrorujesz dla celów publicznych i chcesz, żebym umieścił link to tej strony na stronie głównej, napisz do mnie <beej@piratehaven.org>.

Uwagi dla tłumaczy

Jeśli chcesz przetłumaczyć ten przewodnik na inny język, napisz do mnie <beej@piratehaven.org> a ja zrobię link na stronie głównej do twojego tłumaczenia.

Nie krępuj się by dodać swoje nazwisko i adres email do tłumaczenia.

Przykro mi, ale z powodu przestrzeni dyskowej, nie mogę hostować tłumaczeń.

Prawa autorskie i dystrybucja

Beej's Guide to Network Programming is Copyright © 1995-2001 Brian "Beej" Hall.

Ten przewodnik może być dowolnie przedrukowywany w każdym medium pod warunkiem, że nie jest on zmieniony i jest prezentowany w całości.

Nauczyciele są specjalnie namawiani do rekomendowania lub dostarczania kopi tego przewodnika swoim studentow.

Ten przewodnik może być dowolnie przetłumaczony na inne języki, pod warunkiem, że tłumaczenie będzie dokładne, a przewodnik przedrukowany w całości. Tłumaczenie może również zawierać nazwisko i informacje kontaktowe tłumacza.

Źródła kodu w C przedstawione w tym dokumencie są oddane dla wszystkich.

Pisz <beej@piratehaven.org> po więcej informacji.
Poprzedni dokument Następny dokument
Kurs WinSock, C++ Co to jest gniazdo?