Specyfika komunikacji przy użyciu protokołu TCP/IP jest wzorowana na dostępie do pliku (w systemie UNIX) i wymaga utworzenia na każdym z komunikujących się węzłów/procesów struktury gniazda (ang. socket). Gniazdo jest końcem kanału komunikacyjnego dostępnym dla procesu. Operacja otwierania gniazda udostępnia procesowi deskryptor (uchwyt) używany następnie przy przesyłaniu i odbieraniu danych realizowanych jako zapis i odczyt z gniazda. Gniazda umożliwiają dwukierunkową transmisję danych, to znaczy przy pomocy jednego gniazda można zarówno wysyłać jak i odbierać informacje, podobnie jak pliku otwartego w odpowiednim trybie można używać zarówno do zapisu jak i odczytu informacji. Inaczej jednak niż w przypadku pliku gniazdo składa się z dwóch połówek: jednej służącej do wysyłania, a drugiej do odbierania danych za pomocą gniazda. Każdą z nich można niezależnie zamknąć w przypadku wykonywania na gnieździe tylko jednego rodzaju operacji.
Z gniazdami związane jest pojęcie domeny komunikacyjnej określającej parametry należących do niej gniazd: sposób adresowania i zestaw stosowanych protokołów (w naszym przypadku używamy domeny AF_INET - Internet). Dwa procesy chcące wymieniać informacje muszą posługiwać się gniazdami należącymi do tej samej domeny.
Poza domeną gniazdo jest charakteryzowane przez typ:
- gniazdo strumieniowe (ang. stream socket) inaczej połączeniowe zapewnia dwukierunkowy, wiarygodny i sekwencyjny przepływ danych bez strat i duplikatów, nie zachowujący granic między rekordami
- gniazdo datagramowe (ang. datagram socket) inaczej bezpołączeniowe zapewnia dwukierunkowy przepływ danych bez gwarancji co do wiarygodności, sekwencyjności i niepowielania tzn. datagramy mogą być otrzymywane przez proces w innej kolejności niż zostały nadane; mogą również być powielone. Istotne dla tego typu gniazd jest zachowywanie granic między transmitowanymi za ich pośrednictwem jednostkami danych. Gniazda tego typu są przykładem skrzynek pocztowych pośredniczących w wymianie informacji za pośrednictwem komunikatów
- gniazdo podstawowe (ang. raw socket) służy do implementowania nowych protokołów komunikacyjnych. Gniazda tego typu mają podobne własności co gniazda datagramowe, a ich dokładna charakterystyka zależy od protokołu
Moduł klienta/nadawcy:
1.Przygotowanie do komunikacji - polecenie WinSock-a WSAStartUp.
2.Otwarcie gniazda określonego typu w podanej domenie używającego podanego protokołu - polecenie SOCKET (domena Internet, typ strumieniowy, protokół TCP).
3.Nawiązanie połączenia przy pomocy danego gniazda klienta z gniazdem nasłuchującym na podanym serwerze - polecenie CONNECT (...). Nawiązanie połączenia odbywa się na zasadzie spotkania (ang. rendezvous): jeden z procesów - serwer - oczekuje na połączenie, które próbuje nawiązać drugi proces - klient.
4.Wysyłanie danych poprzez gniazdo klienta do gniazda na serwerze - polecenie SEND(...).
5.Zamknięcie gniazda klienta po transmisji - polecenie CLOSESOCKET(...).
6.Zwolnienie zasobów użytych do komunikacji - polecenie WinSock-a WSACleanUp.
UWAGI
Polecenia charakterystyczne dla modułu WinSock zaczynają się od ciągu „WSA”. Parametry poleceń podano tylko dla polecenia SOCKET, aby uwidocznić specyfikę komunikacji protokołem TCP/IP w sieci Internet. Należy również pamiętać o odmiennym modelu zapisu adresów sieciowych używanym przez procesory INTEL i protokoły sieciowe (są to tzw. intel byte order i network byte order) i odpowiednich konwersjach przy zapisie do struktur adresujących.
Moduł serwera/odbiorcy:
1.Przygotowanie do komunikacji - polecenie WinSock-a WSAStartUp.
2.Otwarcie gniazda określonego typu w podanej domenie używającego podanego protokołu - polecenie SOCKET (domena Internet, typ strumieniowy, protokół TCP). Zarówno serwer jak i klient muszą otworzyć własne gniazda typu strumieniowego przed rozpoczęciem wymiany informacji.
3.Nadanie gniazdku nazwy (adresu) - polecenie BIND(...). Nazwane muszą być gniazda używane przez proces udostępniający usługi (serwer) oraz przez proces korzystający z usług (klient) w trybie bezpołączeniowym (datagram). Proces działający jako klient w trybie połączeniowym (stream) nie musi nazywać gniazd (typu strumieniowego w tym przypadku) w ten sposób.
4.Ustawienie gniazda w tryb nasłuchiwania - polecenie LISTEN(...). Serwer udostępniający usługi jest partnerem pasywnym podczas nawiązywania połączenia. Po przypisaniu gniazdku nazwy zaczyna oczekiwać na połączenie z klientem przestawiając gniazdo w tryb nasłuchiwania i przyjmowania połączeń (nasłuchiwanie odbywa się na porcie podanym w funkcji BIND).
5.Przyjęcie połączenia przy pomocy danego gniazda - polecenie ACCEPT(...). Na potrzeby przyjętego połączenia tworzone jest nowe gniazdo do komunikacji z zaakceptowanym klientem. Parametry nowo utworzonego gniazda są takie, jak parametry gniazda podanego w wywołaniu funkcji ACCEPT.
6.Odbieranie danych wysyłanych przez klienta - polecenie RECV(...).
7.Zamknięcie gniazd serwera po transmisji - polecenie CLOSESOCKET(...). Zamykamy gniazdo nasłuchujące (!) i utworzone do odbierania danych od klienta.
8.Zwolnienie zasobów użytych do komunikacji - polecenie WinSock-a WSACleanUp.
UWAGI KOŃCOWE
Wymiana informacji za pomocą gniazd odbywa się zwykle między procesami pozostającymi w relacji klient-serwer. Serwer nadaje nazwę gniazdku, które ma pośredniczyć w udostępnianiu przezeń usług, klient próbuje nawiązać połączenie między własnym gniazdem a nazwanym przez serwer.
Zamknięcie gniazda zrywa połączenie nawiązane przy pomocy tego gniazda. Dane obecne w gnieździe w momencie zamykania mogą zostać przez proces odebrane przy pomocy operacji odczyt.
Gniazda umożliwiają dwukierunkową transmisję danych, to znaczy przy pomocy jednego gniazda można zarówno wysyłać jak i odbierać informacje. Proces może zamknąć wybraną połowę gniazda odpowiedzialną za wysyłanie bądź odbieranie danych. Taki sposób zamknięcia gniazda nie zrywa połączenia.