Klient


Programowanie aplikacji klient-serwer

Algorytmy działania i implementacja programów klienckich

Określanie adresu serwera

ROZWIĄZANIE OPTYMALNE

Implementacja programu klienta tak, aby przyjmował informacje identyfikujące serwer w postaci argumentów wywołania.

Identyfikacja serwera:

PRZYKŁADY

klient pkt.com.pl smtp

klient pkt.com.pl 25

klient 193.10.2.3 smtp

Funkcja gethostbyname - odwzorowanie nazwy domenowej na adres

SKŁADNIA

#include <netdb.h>

struct hostent *gethostbyname(const char *name);

OPIS

struct hostent

{

char *h_name; /* oficjalna nazwa
dziedzinowa komputera */

char **h_aliases; /* synonimy */

int h_addrtype; /* typ adresu */

int h_length; /* długość adresu */

char **h_addr_list; /* lista adresów */

};

#define h_addr h_addr_list[0]

struct hostent *hptr;

char *examplenam = ″merlin.cs.purdue.edu″;

if (hptr = gethostbyname(examplenam))

{

/* adres IP jest już w hptr->h_addr */

} else{

/* błąd w nazwie - odpowiednie działania */

}

unsigned long inet_addr(const char *cp);

Funkcja getservbyname - odwzorowanie nazwy usługi na powszechnie znany numer portu.

SKŁADNIA

#include <netdb.h>

struct servent *getservbyname(const char *name,
const char *proto);

OPIS

struct servent

{

char *s_name; /* oficjalna nazwa usługi */

char **s_aliases; /* synonimy */

int s_port; /* port dla tej usługi */

/* w sieciowym porządku bajtów */

char *s_proto; /* protokół, którego należy użyć */

};

struct servent *sptr;

if (sptr = getservbyname(″smtp″,″tcp″))

{

/* numer portu jest już w sptr->s_port */

} else{

/* błąd - odpowiednie działania */

}

Funkcja getprotobyname - odwzorowanie nazwy protokołu na jego numer

SKŁADNIA

#include <netdb.h>

struct protoent *getprotobyname(const char *name);

OPIS

struct protoent

{

char *p_name; /* oficjalna nazwa protokołu */

char **p_aliases; /* synonimy */

int p_proto; /* oficjalny numer protokołu */

};

struct protoent *pptr;

if (pptr = getprotobyname(″udp″))

{

/* numer protokołu jest już w pptr->p_proto */

}

else

{

/* błąd - odpowiednie działania */

}

Algorytm działania programu klienckiego typu połączeniowego (TCP)

  1. Określ adres IP i numer portu dla serwera, z którym należy nawiązać komunikację.

  2. Uzyskaj przydział gniazda (wywołanie funkcji socket).

  3. Przekaż systemowi informację, że dla tworzonego połączenia jest potrzebny dowolny nie używany port protokołu na lokalnym komputerze; wybór portu pozostaw oprogramowaniu TCP.

  4. Uzyskaj połączenie gniazda z serwerem (wywołanie funkcji connect).

  5. Komunikuj się z serwerem za pomocą protokołu poziomu użytkowego (wymaga to zazwyczaj wysyłania zapytań przy pomocy funkcji systemowej write i odbieranie odpowiedzi za pomocą funkcji read).

  6. Zamknij połączenie (wywołanie funkcji close ).

Ad 3. Wybór właściwego lokalnego adresu IP wymaga współpracy z procedurami protokołu IP wyznaczającymi trasę transmisji. Dlatego programy klienckie używające protokołu TCP zazwyczaj nie określają adresu lokalnego punktu końcowego, lecz pozostawiaja oprogramowaniu TCP/IP wybór zarówno właściwego adresu IP, jak i wolnego numeru portu.

Algorytm działania programu klienckiego typu bezpołączeniowego (UDP)

  1. Określ adres IP i numer portu dla serwera, z którym należy nawiązać komunikację.

  2. Uzyskaj przydział gniazda.

  3. Przekaż systemowi informację, że dla tworzonego połączenia jest potrzebny dowolny nie używany port protokołu na lokalnym komputerze; wybór portu pozostaw oprogramowaniu UDP.

  4. Podaj adres serwera, do którego mają być wysyłane komunikaty.

  5. Realizuj własne zadania komunikując się z serwerem za pomocą protokołu poziomu użytkowego (wyślij zapytanie - czekaj na odpowiedź).

  6. Zamknij połączenie.

Ad 4. Powiązanie gniazda typu SOCK_DGRAM z adresem serwera realizowane może być za pomocą funkcji connect. W tym przypadku rola funkcji connect sprowadza się jedynie do zapamiętania adresu serwera w strukturze opisującej gniazdo.

Ad 5. Po wykonaniu connect klient wywołuje funkcję read, żeby odczytać datagram i write, żeby go wysłać. Do odebrania lub wysłania całego komunikatu wystarczy pojedyncze wywołanie takiej funkcji.

Ad 6. Funkcja close zamyka gniazdo i zwalnia związane z nim zasoby systemowe. Po jej wywołaniu oprogramowanie UDP będzie odrzucać wszystkie komunikaty wysyłane do portu związanego z danym gniazdem, jednak nie zawiadomi o tym serwera. Zamknięcie gniazda może być również zrealizowane przy pomocy funkcji shutdown. Jej zaletami jest możliwość zamknięcia komunikacji w jednym kierunku oraz powiadamianie o tym serwera.

UWAGA!

Protokół UDP jest bardzo zawodny. Trzeba wbudować bardzo złożone mechanizmy:

Implementacja podstawowych funkcji dla programów klienckich

Utworzenie gniazda i nawiązanie połączenia

socket = connectTCP(nazwa_komputera, usługa);

socket = connectUDP(nazwa_komputera, usługa);

/*

***************************************************

* connectTCP - nawiazanie lacznosci z serwerem

* wskazanej uslugi TCP na wskazanym komputerze

***************************************************

*/

#include ”connectsock.h”

int connectTCP (char *host, char *service)

{

return connectsock(host, service, ”tcp”);

}

/*

***************************************************

* connectUDP - otwarcie gniazda komunikujacego sie

* z serwerem wskazanej uslugi UDP na wskazanym

* komputerze.

***************************************************

*/

#include ”connectsock.h”

int connectUDP (char *host, char *service)

{

return connectsock(host, service, ″udp″);

}

Implementacja podstawowych funkcji dla programów klienckich

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <arpa/inet.h>

#include <netdb.h>

#include <stdlib.h>

#include <string.h>

#ifndef INADDR_NONE

#define INADDR_NONE 0xffffffff

#endif /* INADDR_NONE */

extern int errno;

/*

*---------------------------------------------------

* connectsock - utworzenie i polaczenie gniazda do

* komunikacji TCP albo UDP

*---------------------------------------------------

*/

int connectsock(char *host, char *serv, char *protocol )

{

/* deklaracje zmiennych lokalnych */

struct hostent *phe; /* wskaznik do struktury

opisującej adres komp. */

struct servent *pse; /* wskaznik do struktury

opisującej usługę */

struct protoent *ppe; /* wskaznik do struktury

opisującej protokół */

struct sockaddr_in sin; /* internetowy adres punktu

koncowego */

int s, type; /* deskryptor i typ gniazda */

/* cialo funkcji connectsock */

memset(&sin, 0, sizeof(sin));

sin.sin_family = AF_INET;

Implementacja podstawowych funkcji dla programów klienckich

/* odwzorowanie nazwy usługi na numer portu */

if ( pse = getservbyname(serv, protocol) )

sin.sin_port = pse->s_port;

else

if ((sin.sin_port =

htons((u_short)atoi(serv))) == 0)

exit (1); /* blad odwzorowania */

/* odwzorowanie nazwy komputera lub jego adresu

dziesiętnego na adres IP */

if ( phe = gethostbyname(host) )

memcpy(&sin.sin_addr, phe->h_addr, phe->h_length);

else

if ((sin.sin_addr.s_addr = inet_addr(host)) ==

INADDR_NONE)

exit(2); /* bląd odwzorowania */

/* odwzorowanie nazwy protokołu na jego numer */

if ( (ppe = getprotobyname(protocol)) == 0)

exit(3); /* blad odwzorowania */

/* wybor typu gniazda w zaleznosci od protokolu */

if (strcmp(protocol, "udp") == 0)

type = SOCK_DGRAM;

else

type = SOCK_STREAM;

/* utworzenie gniazda */

s = socket(PF_INET, type, ppe->p_proto);

if (s < 0)

exit(4); /* blad tworzenia gniazda */

/* utworzenie połączenia */

if (connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0)

exit(5); /* problemy w nawiazaniu polaczenia */

return s;

}

1

10

Algorytmy i implementacja programów klienckich



Wyszukiwarka

Podobne podstrony:
Klientelizm, kumoterstwo, nepotyzm
obsluga klienta 1
ING Lojalność wobec klientów na podstawie ING Banku Śląskiego S A
Analiza rentowności klientów przedsiębiorstwa Kospan
Logistyczna obsługa klienta Kempny
crm zarzadzanie relacjami z klienta
Perswazyjny telemarketing 50 narzedzi sprzedazy i obslugi klienta przez telefon do zastosowania od z
klient jako kapital
Klient FTP
OFE zarobiły od stycznia dla klientów 14 mld zł
5.1.13 Sieć klient-serwer, 5.1 Okablowanie sieci LAN
Typologia klientow3, Trenerski - pobrane
odp etyczna wobec klienta, Studia, Metodyka Pracy Socjalnej
jak postępować z trudnym klientem (4 str), TECHNIKI SPRZEDAŻY
Logistyczna obsługa klienta, Notatki log
Działalność?nków inwestycyjnych w obszarze zarządzania aktywami klientów tekst
Bezpieczeństwo klienta i producenta

więcej podobnych podstron