12
Inhoudsopgave A Socket programmatie 1 A.1 Sockets .......................................... 1 A.2 Het adres van een socket ................................. 1 A.3 Client-server ....................................... 2 A.4 Internet Stream Sockets ................................. 4 A.5 Datagram Sockets .................................... 6 A.6 Oefening op sockets ................................... 10 B Inleiding tot het gebruik van Ethereal. 12 B.1 Inleiding. ......................................... 12 B.2 Het onderscheppen van pakketten. ........................... 12 B.3 Analyse van het verkeer.................................. 13 C Gebruik van de Cisco 870 Router. 15 C.1 Inleiding. ......................................... 15 C.2 Piconet. .......................................... 16 D Practicum dynamic routing 19 E Practicum: Domain Name Service 21 F Practicum: configuratie van xinetd 22 G Het opzetten van basisservices op de DMZ server(s). 23 G.1 Een Apache webserver opzetten. ............................ 23 G.2 Een Samba server opzetten................................ 26 H Practicum: electronic mail: smtp en pop 28 I Configureren van een standaard netwerk met NAT en DMZ op de Cisco 870 Series Router. 29 I.1 Inleiding tot het industrieel netwerkconcept....................... 29 I.2 Het configureren van het concept op de Cisco 870 Router............... 30 J Configureren van de Cisco firewall. 31 J.1 Inleiding tot frequent voorkomende firewall types.................... 31 J.2 Instellen van de router................................... 32 K Gemeenschappelijk adresboek via het lightweight directory access protocol (LDAP). 35 K.1 Inleiding en ontstaan van LDAP . ............................ 35 K.2 Aanmaken van het adresboek............................... 36 K.3 Opgave .......................................... 40 I

Socket

Embed Size (px)

DESCRIPTION

TCP/IP Socket

Citation preview

Page 1: Socket

Inhoudsopgave

A Socket programmatie 1A.1 Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1A.2 Het adres van een socket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1A.3 Client-server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2A.4 Internet Stream Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4A.5 Datagram Sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6A.6 Oefening op sockets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10

B Inleiding tot het gebruik van Ethereal. 12B.1 Inleiding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12B.2 Het onderscheppen van pakketten. . . . . . . . . . . . . . . . . . . . . . . . . . . . 12B.3 Analyse van het verkeer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13

C Gebruik van de Cisco 870 Router. 15C.1 Inleiding. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15C.2 Piconet. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16

D Practicum dynamic routing 19

E Practicum: Domain Name Service 21

F Practicum: configuratie van xinetd 22

G Het opzetten van basisservices op de DMZ server(s). 23G.1 Een Apache webserver opzetten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23G.2 Een Samba server opzetten. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26

H Practicum: electronic mail: smtp en pop 28

I Configureren van een standaard netwerk met NAT en DMZ op de Cisco 870Series Router. 29I.1 Inleiding tot het industrieel netwerkconcept. . . . . . . . . . . . . . . . . . . . . . . 29I.2 Het configureren van het concept op de Cisco 870 Router. . . . . . . . . . . . . . . 30

J Configureren van de Cisco firewall. 31J.1 Inleiding tot frequent voorkomende firewall types. . . . . . . . . . . . . . . . . . . . 31J.2 Instellen van de router. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32

K Gemeenschappelijk adresboek viahet lightweight directory access protocol (LDAP). 35K.1 Inleiding en ontstaan van LDAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35K.2 Aanmaken van het adresboek. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36K.3 Opgave . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40

I

Page 2: Socket

A Socket programmatie

A.1 Sockets

Een socket is een communicatie-eindpunt. Via een paar sockets kan een communicatie opgezetworden tussen twee processen. In figuur A.1 is aangegeven dat sockets een laag bovenop hetTCP/IP protocol zijn.

Socket layer

Transport layer TCP/UDP

Internet layer IP

Device layer Ethernetdriver

NETWERK

Socket layer

Transport layerTCP/UDP

Internet layerIP

Device layerEthernetdriver

Figuur A.1: Socket model

Er zijn twee transport-laag protocols:

TCP om stream sockets te realiseren: een betrouwbare connection-oriented datastroom tussentwee hosts. Deze vorm wordt ook virtueel circuit genoemd. Systeem A wil communicerenmet systeem B. A zet een communicatielijn op met B, verstuurt de data, wacht eventueelop antwoord en breekt de communicatie weer af. Deze vorm is analoog aan het voerenvan een telefoongesprek. De verbinding wordt gemaakt door een nummer in te toetsen,de communicatie vindt plaats en de verbinding wordt verbroken door het opleggen van dehoorn.

UDP voor datagram sockets: realisatie van een onbetrouwbare connectieloze communicatie. Dezevorm van communicatie wordt soms ook datagram genoemd. De communicatie verloopthierbij via het versturen van een pakket van de ene host naar de andere. Een datagram is tevergelijken met een brief: de afzender geeft aan waar de brief vandaan komt, het adres verteltwaar de brief naartoe moet. Er wordt beroep gedaan op het postbedrijf om de brief op zijnbestemming te krijgen. Of de brief daar ooit aankomt, is door de afzender niet geweten.

A.2 Het adres van een socket

Vooraleer een socket over het netwerk kan aangesproken worden, moet zo’n socket een naamkrijgen. Dit noemt men binding. De naam is eigenlijk het adres van de socket.Het formaat van het socket adres is afhankelijk van het communicatiedomein. Dit domein wordtaangegeven in het eerste veld van de socketadresstructuur. Voor lokale communicatie tussen pro-cessen op dezelfde machine heeft men het UNIX domein (AF_UNIX) met een socketadresstructuur:

struct sockaddr_un adres;

Deze structuur heeft twee velden:

short sun family : het communicatiedomein, gelijk aan AF_UNIX;

char sun path : het adresgedeelte is een padnaam van een bestand.

Remote communicatie tussen processen op verschillende hosts wordt in het Internet domein(AF_INET) gedaan. In dit geval bestaat de socketadresstructuur uit drie delen:

struct sockaddr_in adres;

1

Page 3: Socket

short sin family : het communicatiedomein, gelijk aan AF_INET;

u short sin port : het poort adres, gekoppeld aan een bepaalde service (er zijn tcp en udpservices); om een onderscheid te kunnen maken tussen verschillende sockets met een zelfdeinternet adres.

struct inaddr sin addr : het internet adres, een 4-byte adres dat een node op het netwerkidentificeert.

Het invullen van zo’n adres gebeurt met de volgende code:

struct sockaddr_in adres;

struct hostent *hp;

struct servent *sp;

sp = getservbyname("voorbeeld","tcp"); /* raadpleegt /etc/services */

hp = gethostbyname("hardy"); /* raadpleegt nameserver of /etc/hosts */

adres.sin_family = AF_INET;

adres.sin_port = sp->s_port;

adres.sin_addr.s_addr = ((struct in_addr *)(hp->h_addr))->s_addr;

Bij het gebruik van zo’n specifieke socketadresstructuur in een system call moet deze gecast wordennaar een algemene socketadresstructuur struct sockaddr.

A.3 Client-server

Client'

&

$

%Socket

A

Server'

&

$

%GebondenSocket B

Lege listen queue

Client• client heeft een socket gecreeerdServer• server heeft een socket gecreeerd• server heeft een adres aan de socket

gebonden• server heeft een listen queue gemaakt

Client'

&

$

%GebondenSocket A

Server'

&

$

%GebondenSocket B

listen queue

-

Client• client heeft een aanvraag voor een

verbinding gedaanServer• server heeft een aanvraag in de listen

queue ontvangen

Client'

&

$

%

Server'

&

$

%GebondenSocket B

listen queue

GebondenSocket A VERBINDING Gebonden

Socket C

ClientServer• server heeft de aanvraag tot verbin-

ding aanvaard• server heeft de verbinding met de

client gerealiseerd met een nieuwe ser-ver socket die al de karakteristiekenvan de originele socket heeft

• de originele server socket blijft luis-teren naar volgende aanvragen voorverbindingen

Figuur A.2: Socket communicatie

2

Page 4: Socket

In figuur A.2 zijn de verschillende fasen voorgesteld bij het opzetten van een communicatie tussentwee processen. Het client proces vraagt een verbinding aan en het server proces aanvaardt dezeaanvraag.Implementatie van een server in het AF UNIX domein:

1 /*

* suvc.c : server virtueel circuit (Unix domein)

3 */

#include <sys / types . h>5 #include <sys / so cke t . h>

#include <sys /un . h>7

main ( int argc , char ∗ argv [ ] )9 {

int s , i , ns ;11 char buf [ 3 2 ] ;

char ∗cp ;13 struct sockaddr un lok un ;

struct sockaddr un rem un ;15 int a len = s izeof ( struct sockaddr un ) ;

17 s = socke t (AF UNIX , SOCK STREAM, 0 ) ;lok un . sun fami ly = AF UNIX ;

19 s t r cpy ( lok un . sun path , argv [ 1 ] ) ;i = bind ( s , ( struct sockaddr ∗)&lok un , s izeof ( struct sockaddr un ) ) ;

21 p r i n t f ( ”%s : bind met %s : %d\n” , argv [ 0 ] , argv [ 1 ] , i ) ;i f ( i == −1 )

23 {per r o r ( ”bind” ) ;

25 e x i t ( 8 ) ;}

27 l i s t e n ( s , 2 ) ;memset ( (char ∗)&rem un , 0 , s izeof ( struct sockaddr un ) ) ;

29 ns = accept ( s , ( struct sockaddr ∗)&rem un , &a len ) ;p r i n t f ( ”%s : accept : %d op adres (%d) :%s : ” , argv [ 0 ] , ns , a len ,

31 rem un . sun path ) ;cp = (char ∗)&rem un . sun path ;

33 for ( i =0; i<a len ; i++)p r i n t f ( ”%.2x . ” , cp++);

35 p r i n t f ( ” | \n” ) ;for ( i =0; ; i++)

37 {i f ( r ecv ( ns , buf , 32 , 0) <= 0 )

39 break ;p r i n t f ( ”%s : ontvangen %s\n” , argv [ 0 ] , buf ) ;

41 }p r i n t f ( ”Einde van %s \n” , argv [ 0 ] ) ;

43 c l o s e ( s ) ; c l o s e ( ns ) ;}

Implementatie van een client in het AF UNIX domein:

/*

2 * cuvc.c : client virtueel circuit (Unix domein)

*/

3

Page 5: Socket

4 #include <sys / types . h>#include <sys / so cke t . h>

6 #include <sys /un . h>

8 main ( int argc , char ∗ argv [ ] ){

10 int s , i ;char buf [ 3 2 ] ;

12 struct sockaddr un rem un ;

14 s = socke t (AF UNIX , SOCK STREAM, 0 ) ;rem un . sun fami ly = AF UNIX ;

16 s t r cpy ( rem un . sun path , argv [ 1 ] ) ;i f ( connect ( s , ( struct sockaddr ∗)&rem un ,

18 s izeof ( struct sockaddr un ) ) == −1 ){

20 per r o r ( ” connect ” ) ;e x i t ( 9 ) ;

22 }p r i n t f ( ”%s : connect met %s \n” , argv [ 0 ] , argv [ 1 ] ) ;

24 for ( i =0; i <5; i++){

26 s p r i n t f ( buf , ”boodschap %d” , i ) ;send ( s , buf , 32 , 0 ) ;

28 p r i n t f ( ”%s : ver s tuurd %s\n” , argv [ 0 ] , buf ) ;}

30 p r i n t f ( ”Einde van %s \n” , argv [ 0 ] ) ;c l o s e ( s ) ;

32 }

A.4 Internet Stream Sockets

Overzicht van de system calls voor een verbinding mbv Internet Stream sockets

CLIENT SERVERactiviteit system call activiteit system callcreeer socket socket() creeer socket socket()

bind een adres bind() bind een adres bind()(optioneel)

maak listen queue listen()

aanvraag verbinding connect()aanvaard verbinding accept()

zend data send()ontvang data recv()zend data send()

ontvang data recv()

sluit verbinding shutdown() sluit verbinding shutdown()(optioneel) of close() (optioneel) of close()

Bespreking van de parameters van de verschillende system calls. Indien het resultaat van zo’nsystem call groter of gelijk is aan 0, betekent dit dat de call succesvol is. Een resultaat gelijkaan -1 geeft aan dat er een fout opgetreden is. Om de system calls in een programma te kunnengebruiken, moeten een aantal includes gebeuren:

4

Page 6: Socket

#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

Creatie van een socket:

s = socket(af, type, protocol);

Het resultaat is een socket-descriptor.

parameter beschrijving input waardeint af adresfamilie,communicatiedomein AF_INET

int type socket type SOCK_STREAM of SOCK_DGRAMint protocol te gebruiken onderliggend protocol 0

Binden van een adres aan een socket:

bind(s, &adres, adreslen);

parameter beschrijving input waardeint s socket socket descriptorstruct sockaddr in adres socket adres pointer naar adres structureint adreslen lengte van socket adres sizeof(struct sockaddr in)

Creatie van de listen queue voor binnenkomende aanvragen:

listen(s, qlen);

parameter beschrijving input waardeint s socket socket descriptorint qlen maximum aantal aanvragen lengte van de queue (1-20)

Aanvraag van een verbinding:

connect(s, &adres, alen);

parameter beschrijving input waardeint s socket socket descriptorstruct sockaddr in adres socket adres pointer naar adres structure met

daarin het adres van de socket waarmeeeen connectie moet gemaakt worden

int alen lengte van socket adres sizeof(struct sockaddr in)

Aanvaarden van een aangevraagde verbinding:

alen = sizeof(struct sockaddr_in);

ns = accept(s, &adres, &alen);

Het resultaat is een nieuwe socket (ns), met dezelfde karakteristieken als de bestaande (s).

parameter beschrijving input waardeint s socket socket descriptorstruct sockaddr in adres socket adres pointer naar adres structure

resultaat: adres van de socket van de aanvragerint alen lengte van socket adres sizeof(struct sockaddr in)

resultaat: lengte van dat adres

5

Page 7: Socket

Sturen van data:

aantal = send(s, msg, len, vlag);

Het resultaat is het werkelijk aantal verstuurde bytes.

parameter beschrijving input waardeint s socket socket descriptorchar *msg te versturen boodschap pointer naar data met boodschapint len grootte van boodschap lengte van gebied waar msg naar wijstint vlag voor speciaal effect normaal 0 (soms MSG_OOB)

Ontvangen van data:

aantal = recv(s, msg, len, vlag);

Het resultaat is het werkelijk aantal ontvangen bytes.

parameter beschrijving input waardeint s socket socket descriptorchar *msg te ontvangen boodschap pointer naar vrije ruimte voor boodschapint len maximale grootte boodschap lengte van gebied waar msg naar wijstint vlag voor speciaal effect 0 (soms MSG_OOB of MSG_PEEK)

Gedeeltelijk afsluiten van een socket:

shutdown(s, hoe);

parameter beschrijving input waardeint s socket socket descriptorint hoe welke kant 0 : socket kan geen data meer ontvangen

1 : socket kan geen data meer zenden(er wordt nog EOF naar de andere kant gestuurd)2 : socket kan geen data meer zenden of ontvangen

Sluiten van een socket:

close(s);

parameter beschrijving input waardeint s socket socket descriptor

A.5 Datagram Sockets

Overzicht van de system calls voor data transfer mbv Datagram sockets

CLIENT SERVERactiviteit system call activiteit system callcreeer socket socket() creeer socket socket()

bind een adres bind() bind een adres bind()

zend boodschap sendto()ontvang boodschap recvfrom()zend boodschap sendto()

ontvang boodschap recvfrom()

6

Page 8: Socket

Bij datagrams wordt dus niet eerst een verbinding gemaakt. Het adres van de bestemmeling enhet adres van de afzender worden via aangepaste send en recv system calls doorgegeven.

Sturen van data: aantal = sendto(s, msg, len, vlag, &naar, nlen);

Het resultaat is het werkelijk aantal verstuurde bytes.

parameter beschrijving input waardeint s socket socket descriptorchar *msg te versturen boodschap pointer naar data met boodschapint len grootte van boodschap lengte van gebied waar msg naar wijstint vlag 0struct sockaddr in naar socket adres pointer naar adres structure

met adres van de bestemmelingint nlen lengte van socket adres sizeof(struct sockaddr in)

Ontvangen van data: aantal = recvfrom(s, msg, len, vlag, &van, &vlen);

Het resultaat is het werkelijk aantal ontvangen bytes.

parameter beschrijving input waardeint s socket socket descriptorchar *msg te ontvangen boodschap pointer naar vrije ruimte voor boodschapint len maximale grootte boodschap lengte van gebied waar msg naar wijstint vlag voor speciaal effect 0 (soms MSG_PEEK)struct sockaddr in van socket adres pointer naar adres structure om

adres van de afzender in te stoppenint vlen lengte van socket adres sizeof(struct sockaddr in)

Implementatie van een server in het AF INET domein:

/*

2 * sudp.c : server UDP

*/

4

#include <sys / types . h>6 #include <sys / so cke t . h>

#include <ne t i n e t / in . h>

8 #include <s i g n a l . h>#include <memory . h>

10 #include <s td i o . h>#include <netdb . h>

12

long t imevar ; /* contains time returned by time() */

14 char ∗ ctime ( ) ; /* declare time formatting routine */

16 main ( int argc , char ∗ argv [ ] ){

18 int s ; /* socket descriptor */

char ∗hostname ;20 char hostn [ 3 2 ] ;

char buf [ 1 0 ] ; /* boodschap van 10 bytes */

22 int aanta l , addr len ;struct hostent ∗hplok ; /* pointer host info lokale host */

24 struct hostent ∗hprem ; /* pointer host info remote host */

struct s e rvent ∗ sp ; /* pointer service informatie */

26 struct s o ckaddr in l o k i n ; /* lokaal socket adres */

7

Page 9: Socket

struct s o ckaddr in rem in ; /* remote socket adres */

28

gethostname( hostn , 3 2 ) ;30 p r i n t f ( ”%s : hostname %s\n” , argv [ 0 ] , hostn ) ;

memset ( ( char ∗)& lok in , 0 , s izeof ( struct s o ckaddr in ) ) ;32 l o k i n . s i n f am i l y = AF INET ;

hplok = gethostbyname ( hostn ) ;34 l o k i n . s in addr . s addr = ( ( struct in addr ∗ ) ( hplok−>h addr))−> s addr ;

sp = getservbyname ( ” e i c t ” , ”udp” ) ;36 i f ( sp == NULL)

{38 f p r i n t f ( s tde r r , ”%s : s e r v i c e n i e t gevonden\n” , argv [ 0 ] ) ;

e x i t ( 1 ) ;40 }

l o k i n . s i n p o r t = sp−>s po r t ;42 p r i n t f ( ”%s : l o k a a l %x %d\n” ,

argv [ 0 ] , l o k i n . s in addr . s addr , l o k i n . s i n p o r t ) ;44 memset ( ( char ∗)&rem in , 0 , s izeof ( struct s o ckaddr in ) ) ;

s = socke t (AF INET , SOCK DGRAM, 0 ) ;46 i f ( s == −1)

{48 per r o r ( argv [ 0 ] ) ;

f p r i n t f ( s tde r r , ”%s : unable to c r e a t e so cke t \n” , argv [ 0 ] ) ;50 e x i t ( 1 ) ;

}52 i f ( bind ( s , ( struct sockaddr ∗)& lok in , s izeof ( struct s o ckaddr in ) ) == −1)

{54 per r o r ( argv [ 0 ] ) ;

f p r i n t f ( s tde r r , ”%s : unable to bind addres s \n” , argv [ 0 ] ) ;56 e x i t ( 1 ) ;

}58 addr len = s izeof ( struct s o ckaddr in ) ;

aanta l = recvfrom ( s , buf , 10 , 0 , ( struct sockaddr ∗)&rem in , &addr len ) ;60 p r i n t f ( ”%s : ontvangen : %s \n” , argv [ 0 ] , buf ) ;

s t r cpy ( buf , ” ha l l o ! ! ” ) ;62 sendto ( s , buf , aanta l , 0 , ( struct sockaddr ∗)&rem in , addr len ) ;

hprem = gethostbyaddr ( ( char ∗) &rem in . s in addr ,64 s izeof ( struct in addr ) , rem in . s i n f am i l y ) ;

i f (hprem == NULL)66 hostname = (char ∗) i n e t n t o a ( rem in . s in addr ) ;

else68 hostname = hprem−>h name ;

c l o s e ( s ) ;70 time (&timevar ) ;

p r i n t f ( ”%s : ver s tuurd naar host %s (%s ) poort %u op %s\n” ,72 argv [ 0 ] , hostname , i n e t n t o a ( rem in . s in addr ) ,

ntohs ( rem in . s i n p o r t ) , ctime(&timevar ) ) ;74 }

Implementatie van een client in het AF INET domein:

/*

2 * cudp.c : client UDP

*/

4

8

Page 10: Socket

#include <sys / types . h>6 #include <sys / so cke t . h>

#include <ne t i n e t / in . h>

8 #include <s i g n a l . h>#include <memory . h>

10 #include <s td i o . h>#include <netdb . h>

12

long t imevar ; /* contains time returned by time() */

14 char ∗ ctime ( ) ; /* declare time formatting routine */

16 main ( int argc , char ∗ argv [ ] ){

18 int s ; /* socket descriptor */

char ∗hostname ;20 char hostn [ 3 2 ] ;

char buf [ 1 0 ] ; /* boodschap van 10 bytes */

22 int aanta l , addr len ;struct hostent ∗hplok ; /* pointer host info lokale host */

24 struct hostent ∗hprem ; /* pointer host info remote host */

struct s e rvent ∗ sp ; /* pointer service informatie */

26 struct s o ckaddr in l o k i n ; /* lokaal socket adres */

struct s o ckaddr in rem in ; /* remote socket adres */

28

gethostname( hostn , 3 2 ) ;30 p r i n t f ( ”%s : hostname %s\n” , argv [ 0 ] , hostn ) ;

memset ( ( char ∗)& lok in , 0 , s izeof ( struct s o ckaddr in ) ) ;32 l o k i n . s i n f am i l y = AF INET ;

hplok = gethostbyname ( hostn ) ;34 l o k i n . s in addr . s addr = ( ( struct in addr ∗ ) ( hplok−>h addr))−> s addr ;

l o k i n . s i n p o r t = 0 ;36 p r i n t f ( ”%s : l o k a a l %x %d\n” ,

argv [ 0 ] , l o k i n . s in addr . s addr , l o k i n . s i n p o r t ) ;38 s = socke t (AF INET , SOCK DGRAM, 0 ) ;

i f ( s == −1)40 {

per r o r ( argv [ 0 ] ) ;42 f p r i n t f ( s tde r r , ”%s : unable to c r e a t e so cke t \n” , argv [ 0 ] ) ;

e x i t ( 1 ) ;44 }

i f ( bind ( s , ( struct sockaddr ∗)& lok in , s izeof ( struct s o ckaddr in ) ) == −1)46 {

per r o r ( argv [ 0 ] ) ;48 f p r i n t f ( s tde r r , ”%s : unable to bind addres s \n” , argv [ 0 ] ) ;

e x i t ( 1 ) ;50 }

memset ( ( char ∗)&rem in , 0 , s izeof ( struct s o ckaddr in ) ) ;52 sp = getservbyname ( ” e i c t ” , ”udp” ) ;

i f ( sp == NULL)54 {

f p r i n t f ( s tde r r , ”%s : s e r v i c e n i e t gevonden\n” , argv [ 0 ] ) ;56 e x i t ( 1 ) ;

}58 hprem = gethostbyname ( argv [ 1 ] ) ;

9

Page 11: Socket

rem in . s i n f am i l y = AF INET ;60 rem in . s in addr . s addr = ( ( struct in addr ∗ ) ( hprem−>h addr))−> s addr ;

rem in . s i n p o r t = sp−>s po r t ;62 p r i n t f ( ”%s : remote %x %d\n” ,

argv [ 0 ] , rem in . s in addr . s addr , rem in . s i n p o r t ) ;64 addr len = s izeof ( struct s o ckaddr in ) ;

s t r cpy ( buf , ” ha l l o ?” ) ;66 sendto ( s , buf , 10 , 0 , ( struct sockaddr ∗)&rem in , addr len ) ;

aanta l = recvfrom ( s , buf , 10 , 0 , ( struct sockaddr ∗)&rem in , &addr len ) ;68 p r i n t f ( ”%s : ontvangen : %s \n” , argv [ 0 ] , buf ) ;

c l o s e ( s ) ;70 hprem = gethostbyaddr ( ( char ∗) &rem in . s in addr ,

s izeof ( struct in addr ) , rem in . s i n f am i l y ) ;72 i f (hprem == NULL)

hostname = (char ∗) i n e t n t o a ( rem in . s in addr ) ;74 else

hostname = hprem−>h name ; /* point to host’s name */

76 time (&timevar ) ;p r i n t f ( ”%s : ontvangen van host %s (%s ) poort %u op %s\n” ,

78 argv [ 0 ] , hostname , i n e t n t o a ( rem in . s in addr ) ,ntohs ( rem in . s i n p o r t ) , ctime(&timevar ) ) ;

80 }

In de programma’s worden enkele steunroutines gebruikt:

inet ntoa : argument is een internet adres en dit wordt door de routine omgezet in een ASCIIstring met het adres in dot notatie; het resultaat is een pointer naar deze string, eenstatisch geallokeerde buffer.

ntohl : omvormen van een unsigned long (bijv. internetadres) van netwerk byte volgorde naarhost byte volgorde (htonl: omgekeerde).

ntohs : omvormen van een unsigned short (bijv. service nummer) van netwerk byte volgorde naarhost byte volgorde (htons: omgekeerde).

A.6 Oefening op sockets

Schrijf een client- en serverprogramma die gebruik maken van STREAM sockets in het AF INETdomein.Het serverprogramma wordt in background opgestart. Het serverprogramma creeert een stream-socket, bindt hieraan een adres op basis van de eigen hostname en de service eictXY (argumentvan het programma) en maakt een listen queue van 3 elementen. Het serverprogramma wacht dantotdat er een aanvraag voor een verbinding is.Het clientprogramma creeert een stream-socket en maakt een verbinding met de server. De host-naam van de host waarop de server zijn diensten aanbiedt en de bijhorende servicenaam wordenmeegegeven als argumenten van het programma.

Nadat de verbinding tot stand gebracht is, wordeneen aantal boodschappen over en weer (ping-pong) ge-stuurd. De boodschap bevat onder meer volgende vel-den: een volgnummer van de boodschap en het totaalaantal te versturen boodschappen. Dit aantal bood-schappen wordt als tweede argument aan de client mee-gegeven bij het opstarten. In de boodschap kan ook eenchar-array opgenomen worden, waarin door de clienthet woord “ping” en door de server het woord “pong”kan geplaatst worden.

De structure van de boodschap:

#define LEN 28

typedef struct mess

{

short volgnr;

short totaal;

char data[LEN];

} Mess;

int messlen = sizeof(Mess);

10

Page 12: Socket

Nadat de client alle antwoorden ontvangen heeft, stopt deze. De server blijft echter verder draaien.Dit proces verlaat ook de ping-pong lus en gaat terug wachten op een volgende aanvraag voor eenverbinding.

Uitbreiding. Wanneer een client in zijn char-array veld het woord “gedaan” plaatst en dit door-stuurt naar de server, verlaat de server ook de accept-lus en stopt. (De client deze boodschap latensturen kan bijvoorbeeld gebeuren door als argument voor het aantal te versturen boodschappennul te geven.)

11