PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130...

58
PRATICA - Lezione 1 PRATICA (Lez. 1) Autunno 2003 2 #include <stdio.h> int main(int argc, char **argv) { union { short s; char c[sizeof(short)]; } un; un.s = 0x0102; printf("CPU = %s - byte ordering: ",getenv("CPU")); if (sizeof(short) == 2) { if ( un.c[0] == 1 && un.c[1] == 2 ) printf ("big-endian\n"); else if ( un.c[0] == 2 && un.c[1] == 1 ) printf ("little-endian\n"); else printf("unknown\n"); } else printf("size of short: %d.\n",sizeof(short)); exit(0); }

Transcript of PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130...

Page 1: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*0�"*��)+� �� 12�

����������

PRATICA - Lezione 1

PRATICA (Lez. 1)

Autunno 20032

3547698:47;!<$<>=9=@?BA

#include <stdio.h>

int main(int argc, char **argv) {union {

short s;char c[sizeof(short)];

} un;

un.s = 0x0102;printf("CPU = %s - byte ordering: " ,getenv("CPU"));

if (sizeof(short) == 2) {if ( un.c[0] == 1 && un.c[1] == 2 )

printf ("big-endian\n" );else if ( un.c[0] == 2 && un.c[1] == 1 )

printf (" little-endian\n" );else

printf("unknown\n" );}else

printf("size of short: %d.\n" ,sizeof(short));

exit(0);}

Page 2: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 1)

Autunno 20033

A'69<��:=�� ;��*=@69?����� ;��� � =�� �

� � 4 ;���� 6947<>;!4��>=����/69478���? � �>A =@?���6 �:=����>6:8:8�� ��� 6� ?�=@4�� � ;�� ���6��:=����>698:8�� ��� 6��69? � �� =�!:4��!4 ="��#�� =@?��$

��

8����%� ��&�'���

8����)( 6*� ��&+� ��&�'���

8����)(-,�<�./� ="!���; �10 (-� <%./� =�!2(43 <�. =@?����:; ��0 (456(-7-798�:<;>='�'�'

��

<>;���?'�'�'�� ; � � ��� 6

PRATICA (Lez. 1)

Autunno 20034

� ;<��<� =�� �

#Makefile

ALL = lib-errori lib-corso-reti \daytimesrv daytimecli daytimesrv-ric \echosrv echocli echosrv-sigh

all: $(ALL)

.c: lib-errori.o lib-corso-reti.o@echo compiling $< with rule 1gcc $< -g -O0 –Werror -o $@ lib-errori.o lib-corso-reti.o

lib-errori: lib-errori.cgcc -g -O0 -Werror -c lib-errori.c

lib-corso-reti: lib-corso-reti.cgcc -g -O0 -Werror -c lib-corso-reti.c

clean:rm -f $(ALL)rm -f *~rm -f *.o

>

Page 3: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 1)

Autunno 20035

8 ����<��:=�6

r obdep@zi r cone: ~/ Cor si / Ret i / C> gmakegcc - g - O0 - Wer r or - c l i b- er r or i . cgcc - g - O0 - Wer r or - c l i b- cor so- r et i . ccompi l i ng dayt i mesr v. c wi t h r ul e 1gcc dayt i mesr v. c - g - O0 - Wer r or - o dayt i mesr v l i b- er r or i . ol i b- cor so- r et i . ocompi l i ng dayt i mecl i . c wi t h r ul e 1gcc dayt i mecl i . c - g - O0 - Wer r or - o dayt i mecl i l i b- er r or i . ol i b- cor so- r et i . ocompi l i ng dayt i mesr v- r i c. c wi t h r ul e 1gcc dayt i mesr v- r i c. c - g - O0 - Wer r or - o dayt i mesr v- r i c l i b-er r or i . o l i b- cor so- r et i . ocompi l i ng echosr v. c wi t h r ul e 1gcc echosr v. c - g - O0 - Wer r or - o echosr v l i b- er r or i . o l i b-cor so- r et i . o……

PRATICA (Lez. 1)

Autunno 20036

,�=�!:4���47=��%�>=@?��<� � ����� =�� �

��

A ��4��;$=�� � =�� ���:;�=@?��<� � ����4 �>?�� �"� ���:=�4 �<� � 694�. �:=947=�����4��;� � ;�?/�:;�4�� �������69<��:=�� ; � 6:4��

�� � �/4 � =@?��<� � ����� � � �/4 � � ="! � =@?��<� � �����9'�'�'

��

A ��4��;$=�� � =�� ���:;�=@?��<� � ����4 �>?�� �"� ;%��� �

�� =�!:4��!4 ="������� �="� ="��; � �%��6�? (-��?�� � ��6�<>;!?��:6��:=���69<��:=�� ;��*=@6�?/�

�� ;$47="� �!4���;%�:= � ; � = � =�!:4���47=������ ; �1� ;$=@?��:6�� � =�� � ;�?/��;!4 �# � � �/4 � � =�!�� � � �/4 � � 6��;�� � � =�!��-'�'�'�$)�>?�� ��� ���:=@4��<� � 694�. ����� �=�� =��; � ���6�? (-,

�� =�!:4��!4 =�;%�:=����<� ; � � � # ��6�? � =���?����:47=�? � ��$

Page 4: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 1)

Autunno 20037

:!;��/=��<' 0

#ifndef __BASIC__ #define __BASIC__#include <sys/types.h> /* basic system data types */#include <sys/socket.h> /* basic socket definitions */#include <sys/time.h> /* timeval{} for select() */#include <time.h> /* timespec{} for pselect() */#include <netinet/in.h> /* sockaddr_in{} and other Internet defns */#include <arpa/inet.h> /* inet(3) functions */#include <errno.h>

……

#include <unistd.h>#include <sys/wait.h>#include <sys/un.h> /* for Unix domain sockets */

#define MAXLINE 256#define PORT 12345#define BACKLOG 5 #define MAX(a, b) ((a) > (b) ? (a) : (b))

#endif

PRATICA (Lez. 1)

Autunno 20038

,�=�!:4��!4 =�;$8��<� � =@6�?�= ��47476947=

� � � � � ?��� ��47<>=@?�;�?�6*� � � ����� � ��=@69?����������:47698:47;!<>< ;

���!4 4�� <��/8 � � ;!<��:;%�/6 � 6*� � �!474 6�4 �

��!4 4���� � = � � ��474��4��.�� � 0 =@;�<>;�?�6���� = �

Page 5: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 1)

Autunno 20039

,�=�!:4��!4 =�;%�694��/6 4�� � =

��

4�� � = �

��

4�� � = � 4���;��:?� ������������������� ����������������

�4�� � = � � 47= � ��?� ������� ������������� ����������������

�4�� � = � 4���;��4� =�?��� ���������� ��!����� �"�

����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*0�"*��)+� �� 12�

� �� � � � �

PRATICA - Lezione 2

Page 6: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200311

� 6����� �

�; ?B=@?��:=@47=�� �*6�3*32�<� � ?�;��:694 � ;%� � � ? 0 6 � �

�; ?B=@?��:=@47=�� �*6�3*32�<� � ?�;��:694 � ;%� � �"� � ; � � 476 0 6�� �

PRATICA (Lez. 2)

Autunno 200312

� � ?��*=@69?�=����!4 = �/6����� �

socket()

bind()

listen()

accept()socket()

connect()

write()

read()

read()

write()

read()

close()

close()

������� � �������� ���������� � ���

� ����� � � � � � ����� ��� ���������� � ���

��� ��� � � ��� � ��� ��

� � � � � ��!�� � ��� "��� � ��� ����# ����� � ��!�� � ���

��� ��� � � ��� � �� ��CL

IEN

T

SE

RV

ER

$ � %�� � ��� �!���� �'& � ( ����� �� "�����)( ������� � � ( ��� $+*-,

Page 7: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200313

� 6��� ;<���:4�� =@?

struct in_addr {in_addr_t s_addr; /* 32-bit, network byte ordered */

}

struct sockaddr_in {uint8_t sin_len;sa_family_t sin_family; /* tipo di protocollo, AF_INET */in_port_t sin_port; /* 16-bit, network byte ordered */struct in_addr sin_addr; /* struttura indirizzo IP */char sin_zero[8];

}

struct sockaddr {uint8_t sin_len;sa_family_t sin_family; /* tipo di protocollo: AF_XXX */char sa_data[14]; /* indirizzo specifico del protocollo */

}

� ��� ��� &����(�

����� � � ����� ��������������������� �������� ��!���� ���� � ������"#�$��"�����%� ��� &����('*)�+*,�-.��

� ��� ����/ � �� 0 '��21��3� ����� ���4�� �!� � '*�4�%��� ���� 65�'��%� 7� 8 �%� ����'���'* �� 9(���:����4���3"��$��"�������'��2������( ��!�%�%�� �� �;�����:���#���

PRATICA (Lez. 2)

Autunno 200314

, � ?�8 0 �<� � ��� � 4 � ��� � 4����/6 ���� �

Page 8: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200315

� � ?��*=@6�?/�%�/6����� �

�� 69?�6��:4 �<�/=��:; ��� 6�� � � ���/6 =�?/�/="��<��

�� � � ? =�? � ��476 � � �/; � 6��69<���� =�� ����� ���47=�� � 694 ?�6�? � ���� �����!4 � � �/; � 6���6�<����/6�� �� � ���<���4 ="� � 694 ��� ="� ������4��/;

�� 6����� � ��� =�� ���/69?�6�� =�� � =��:=��B6 <��!?�6 ; ��� 6�� � �<���/6B<$6��:6� � ����� � ��� ���� / (�� ��� ( � ( / ��� ������� �� & � ( �"��������� � / �

PRATICA (Lez. 2)

Autunno 200316

� � ?��*=@6�?/�%�/6����� �

��; ? =�? � ��476�� 0 ������� �=�� =��; � � ; � �%� ;�<>=@84� =@;��:= �:4 6 � 6��6 ��� =��/==@?� �!?���� � �/;!4����

� ��� ������� $ � , ���� ��� ������� $�� � , � �� ��� � �! * � � %���(�#" / (�� � / �%$ ��/ � ���! ������ ������� / / ( ������ ('& (�� )(� ��� ��*+ -, $ � � (���.����� %!� � ��( ! � �!�� � / ����+/

��; ? =�? � ��476�� 0 ���:=����>=�� � ="�:6��:=��/6����� �

� �� *�0 ��� $ *�����1 %���� "� ( � � ���� 2� ������ �+$ $+*-, (� �� *�0 ��3546*���1 %����7�"� ���� � �� � ��+$�,�3 , (� �� *�0 ��*+�58 %���� � % % / � � �'& � ( ����� � � �������� 9� ,

�� : �

� 47;!?�?���� 0 ������4�� *�0 ��*+�58

Page 9: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200317

� � ?��*=�69?����69?�?/�<� �

� � �!� / ����� � ����� � (���.���#" &��� �� � ( ������� !$ � ������ � �� ��� � (��+.����� �� ������������� �� (��+.�/ ������������� �� (��

� � / ( � ��� ����� �( ��� (��! �" ���������( � �$# � �� 0

�8&% 3 � 8�745 ;'%

�8�A 5)(*(*+ 8 ��; � 8�7

�8-,45 � % ;.(/+48 � A*,

PRATICA (Lez. 2)

Autunno 200318

� � ?��*=@69?���!:=�?��

� � ����/ �"��� � ���0� � (��+. � #" &��� �! �"� � ��$ � �!����� � �� !� � (��+.��+��� �0 �1�23����� �� (��+.�/ ������4������� ����(��

� � / ( � ��� ����� �( ��� (��! �" ���������( � �$# � �� 0

��

=�?��:=@47=�� ��6�3*3 # ��������� �����!4 � � ?�; ��� ��� �>=@? � ��4�� ;������ $��:6�4 � ;

��!? � 47;!<%!:=

�?��<��� � ?�6

�3( � 797/+ � � (65 � :

Page 10: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200319

� � ?��*=�69?��?� ="� � ��?

�3 ��4 ��� � ; � � � � ? �/6����� � ���4���; � 6 ; �1� =�� 6 �4�$=�����!4 ?/� � �/=;<����� �1� ;�� 0 �%�/=@;$=����/6����� � �:= � ?��<� ="��? �

�( �����:=@;�8:47;!<$<>;>;%� � ; � = %+A 32� ;�< � 6�����4����:; * �# ��� 3 ;��� � $ � �

PRATICA (Lez. 2)

Autunno 200320

:!;�� /� 698

Server accept

connect dal client

� � � ������ ��� ���� ���������� � ���

����� ��� ���� ����� ����# � � �� � �

��� ��� ��� ����������� � �������# � � � �� �� �� � ��� � ���� � ��� � ���

��� ��� ��� ����������� � ���� � ����# � � �� �� �� �� � � � ����� ��� ���

Page 11: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200321

� � ?��*=�69?��>;�� ���<� �

� � �!� / ����� � ����� � (���.���#" &��� �� ����� � %�#$ � ���� � � �� !� � (���.����� �0 ���� � ����� �� (��+.�/ ������4������� ����(��

� � / ( � ��� ����� �( ��� (��- �" � ��������( � ��� (���.���9�"� � ����� %��( � � �� 0

�� �>?�69? ���>?����/6�?�6��/= !4� 6����;

��3 ?�� 0 =@;�< ; � ;��69? � =��!?��>=���� =�� � ��?�=@?�8+�/6����� �

� � ��47=� 6947?�6��69? � =���?��>=����/6����� � ��6�?�?��<���/6 ;�����;�4 � =���6 � ;!4��

�<� =��!? �

PRATICA (Lez. 2)

Autunno 200322

7 ;�. � =�<�������4 ���!49# & $

#include "basic.h"#include <time.h>int main(int argc, char **argv) {

pid_t pid;int listenfd, connfd;struct sockaddr_in servaddr;char buff[MAXLINE];time_t ticks;struct servent *sp;if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)

err_sys("socket error" );

if( (sp = getservbyname("daytime" , " tcp" )) == NULL ) {fprintf(stderr, "getservbyname error for daytime, tcp." );exit(-1);

}bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = sp->s_port;

if( (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0)err_sys("bind error" );

if( listen(listenfd, BACKLOG) < 0 ) /* backlog = 5 */err_sys(" listen error" );

daytimesrv.c

Page 12: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200323

7 ;�. � =�<�������4 ���!49#���$

for ( ; ; ) {if( (connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) < 0)

err_sys("accept error" );

ticks = time(NULL);snprintf(buff, sizeof(buff), "%.24s\r\n" , ctime(&ticks));write(connfd, buff, strlen(buff));close(connfd);

}}

��

� ��4 ���>= � � =��!? � � ?�6 ; ��� ;�� 6 � � ;� � � ;!?��:6 � ?�� � =��!?

� ���69?�?/�<���/6 =������!8 � ��? � �%� � =��!? � ��� ���;������ ��� ;�4 �

� � �������� ; !:=�� �����!49���!4 ����4 ����<��4� =��=��69<��>=����:;�. � = <��

PRATICA (Lez. 2)

Autunno 200324

7 ;�. � =�<����<� ="��? � # & $

#include "basic.h"

int main(int argc, char **argv) {int sockfd, n;char recvline[MAXLINE + 1];struct sockaddr_in servaddr;struct in_addr **pptr;struct hostent *hp;struct servent *sp;

if (argc != 3)err_quit("usage: daytimecli <hostname> <service>" );

if ( (hp = gethostbyname(argv[1])) == NULL)err_quit("hostname error for %s: %s" , argv[1], hstrerror(h_errno));

if ( (sp = getservbyname(argv[2], " tcp" )) == NULL)err_quit("getservbyname error for %s" , argv[2]);

pptr = (struct in_addr **) hp->h_addr_list;

daytimecli.c

Page 13: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200325

7 ;�. � =�<����<� ="��? � #���$

for ( ; *pptr != NULL; pptr++) {if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )

err_sys("socket error" );

bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = sp->s_port;memcpy(&servaddr.sin_addr, *pptr, sizeof(struct in_addr));

if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) == 0)break; /* success */

err_ret("connect error" );close(sockfd);

}

if (*pptr == NULL)err_quit("unable to connect" );

while ( (n = read(sockfd, recvline, MAXLINE)) > 0) {recvline[n] = 0; /* null terminate */fputs(recvline, stdout);

}exit(0);

}

PRATICA (Lez. 2)

Autunno 200326

� ��4 ����4 47=��694��/=�� =

pid_t pid;int listenfd, connfd;

listenfd = socket(….);

/* riempi la struttura sockaddr_in (es. numero di porta) */

bind(listenfd,….)listen(listenfd, LISTENQ)

for ( ; ; ) {connfd = accept(listenfd,…);if ( (pid = fork()) == 0) {

close(listenfd); /* figlio chiude il socket di ascolto */DOIT(connfd); /* serve la richiesta */close(connfd); /* chiude il socket */exit(0); /* il figlio termina */

}close(connfd); /* il padre chiude il socket della connessione */

}

Page 14: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200327

� ��4 ����4 47=��694��/=�� =

connect()listensd

Richiesta di connessione

connect()listensd

Connessione stabilita connsd

�3 ������4 ����4 � 0 =@;�<>;>;�� ���<� � # $

� � =��!?����4 �!;� 6 � ? ? � 6�� 6��/6����� � ��� ���47=�� � 6�4 ?�� � � �!4 ����4 ����4� ; �69?�?/�<���/=@69?����69? � � � � � 6��:;!4 � =���6 � ;�4 �%� � =��!? �

Client Server

Client Server

PRATICA (Lez. 2)

Autunno 200328

� ��4 ����4 47=��694��/=�� =

connect()listensd

Connessione stabilita

connsd

�3 � ����4 ����4 � 0 =�;!<$;%� 694��# $

�35;<�:4����%� =�84� =@6 ?���������4 ����49�69?��:=�� ="�:69?�6 =����/6 � �� �

Client Server

listensd

connsd

Server

padre

figlio

Page 15: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200329

� ��4 ����4 47=��694��/=�� =

connect()listensd

Connessione stabilita

connsd

�3 ���:;<�:4���� 0 = � ���>=����/6 � �� � ��� �"� ; ��69?�?�� ���/=�69?���

, �� ��� � ������� ���" (������)( ������� � � ( ���

�3 ��� =@84� =@6�� 0 = � ���>=����/6����� � ���!4 � � ;�� � � �1� ;��*=�69?����:=9? � 6 �����6�?�?��<���/=@69?�=�

, �� ����� �� � � / ��� ( ���������� ( ��� �)( ��� / � / � ����

Client Server

listensd

connsd

Server

padre

figlio

PRATICA (Lez. 2)

Autunno 200330

= � � �/6 � ?�;�<����>8�� � ���<�!47?�;!<%�

� � ����� "� ���� ��-(���#�'���� �� ���� ��� ������'���� ���&��� :� ��������� ������"��:� �%'���� � � ������ ������� ��������� �'����.� ����������������� �� �!#"� ��� ��������������(�& �� � �#������� �4���3"��:� �'���� � � ������$�&%'��()���*�+�+��� �%'����.� ���,���-�*������� �& +!#"

.��� '��3� ������ ��'�����'0/21�)*����!���3'������ �'����.�� 2 �������3� ����'�� ��'354

�+�= � 6947?�;�?�6� / 6 � � � � ��� & & ( / ("� � / ������ (���� ���(�� / � (���.���� ��6 � � � � � � & & ( ��� / / 6 � / ���( / � �( ��� / / ���)( ���������� ( �������� (���� ������ / � (��+. �

�� ��4 ��������4�� 0�7� , � ��/ � ���� �&!��� ( � �&�� �� ������ � � � ( � � �98 �� / � % ( � ��9:�������� �� ����� , � ��/ � ���� � ( � �� / 6 � � � � ��� & & ( � , �� ���( � ����� � ( � ( %"�<;�� ���� � � ��� ��� �� , ������&�� �� ����������� � ��� ( � % ( � ��>= # ������� �!�� ���� % ( � ����� � � ���� �� ������� ��� (�� � %���� / 6 � � � � � � & & ( � , $@?:02ACB>B>D � A�02E+(� 3 ( % ( ������GF���� � � %" *� ��� �� / � � ����� / ��� � � � ��� & &������ / / ���)( ���!� � ��� ( ���

� 0IH /("�� ��� � �� �������3� ����'�� ��� & ��(� !����� ��'KJ�"���( �'*�������� �&� �7 ���

Page 16: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200331

8 � 0 6����!4 ���!49# & $

#include "basic.h"#include "echo.h"

int main(int argc, char **argv) {pid_t childpid;int listenfd, connfd;struct sockaddr_in servaddr, cliaddr;socklen_t cliaddr_len;

if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)err_sys("socket error" );

bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(PORT); /* daytime server */

if( (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0)err_sys("bind error" );

if( listen(listenfd, LISTENQ) < 0 )err_sys(" listen error" );

echosrv.c

PRATICA (Lez. 2)

Autunno 200332

8 � 0 6����!4 ���!49#���$

for ( ; ; ) {cliaddr_len = sizeof(cliaddr);if( (connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &cliaddr_len)) < 0)

err_sys("accept error" );

if( (childpid = fork()) == 0 ) {close(listenfd);str_echo(connfd);exit(0);

}close(connfd);

}}

void str_echo(int sockfd) {ssize_t n;char line[MAXLINE];for ( ; ; ) {

if ( (n = read(sockfd, line, MAXLINE)) == 0)return; /* connection closed by other end */

write(sockfd, line, n);}

}

Page 17: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200333

8 � 0 6��<� =���? � # & $

#include "basic.h"#include "echo.h"int main(int argc, char **argv) {

int sockfd, n;struct sockaddr_in servaddr;

if (argc != 2)err_quit("usage: echotcpcli <IPaddress>" );

if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)err_sys("socket error" );

bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT); /* echo server */if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)

err_quit(" inet_pton error for %s" , argv[1]);

if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)err_sys("connect error" );

str_cli(stdin, sockfd); /* svolge tutto il lavoro del client */exit(0);

}

echocli.c

PRATICA (Lez. 2)

Autunno 200334

8 � 0 6��<� =���? � #���$

void str_cli(FILE *fp, int sockfd) {char sendline[MAXLINE], recvline[MAXLINE];while (fgets(sendline, MAXLINE, fp) != NULL) {

reti_writen(sockfd, sendline, strlen(sendline));if (reti_readline(sockfd, recvline, MAXLINE) == 0)

err_quit("str_cli: server terminated prematurely" );fputs(recvline, stdout);

}}

Page 18: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200335

8�� 0 6�����4 ���!4

prompt > echoserver &[1] 21130

prompt > netstat –aProto Recv-Q Send-Q Local address Foreign address (state)Tcp 0 0 *.9877 *.* LISTEN

prompt > echoclient 127.0.0.1

�, ��� � � % / � ��� ���� ������� �� ( � � � � � ��� ��� ����� ����/ � ���� � / / ��� ���� ��� ���� �+&�� ���

� � 8 !� � �( %� ����( / ���)( ���������� ( ���9:�������� / � ��

prompt > netstat –aProto Recv-Q Send-Q Local address Foreign address (state)Tcp 0 0 localhost.9877 localhost.1052 ESTABLISHEDTcp 0 0 localhost.1052 localhost.9877 ESTABLISHEDTcp 0 0 *.9877 *.* LISTEN

� � �� �� 6 � / � � � � ����� � �

PRATICA (Lez. 2)

Autunno 200336

8�� 0 6�����4 ���!4

�3 �����!4 ���!4 0 ; � 0 = � �/6 =����/6����� �

�3 ���<� ="��? � �>?������ 6�� � ; � 6+�:= $ � 1 �!�+8 ��� $� ��/ / � �(��+&�����&�� ��� / � �)( �"�!� � � � ( ������� �������� �K8 �����( �����( %���� ��

� ��� �( %������ (+� ( $��+1 � �!( %��������� ������������:��� ����'��3& ���� '����!�����!��!�%'�� "�� ��� &�' A� 4 9(� �������������%'2��� �� ���3'� ��'*��� ������ �� �%����� "�� ��� &�' � ?:0� � 5�����&����$�%���:�� 9����������!�����������$���! ��������%���3����� � &�� �(���� ��� � ��3������ �2&�'� �' � ��'�� ������ ��� ������� �����3� �:����'��2�%"��������%�� 9�� ��'��������%�%� '����

prompt > echoclient 127.0.0.1Ciao serverCiao serverArrivederciArrivederci^Dprompt >

prompt > netstat –a | grep 9877Tcp 0 0 localhost.1052 localhost.9877 TIME_WAITTcp 0 0 *.9877 *.* LISTEN

Digitata al terminaleRisposta del server

Digitata al terminaleRisposta del server

Digitata al terminale

Page 19: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200337

8�� 0 6�����4 ���!4

� 3 � � � ���� � (�� 37 � /�� / � � �! ����� �� �����+&�� � ���� � ( �GF � � ��/+.���� ��� / ��&�� ���� �� ��� � � / ��� � � ����� %��( ��>8 � � � � ���!�+&���� �)(��. � ������ ��� � %��( ��

� �� � � ��� / � (���.������� / � / � ���� � � �������+&�� ��)(� � ���& � !� "� ��� % / � � �

�� �%���� �� �%� '���� �� � ?:0 �������� 9����

� � �3� �����%� '���� ���� � A� 4 �� � ?30� � 8 �����( %� ��!�( � / � ��� ����� :��!� / / ( �����( * �! ���!�+8 ��� $ �� �!�� ��� /�� / � ���� :

�!� / / ( � ����('� ��� �+8 ��� $ ���� � � %���� �� %���� ������ / / ���&"� �� � ��� �� ������ ( ������� � � ( ��� $+*-, :��)( �!� / ���

�� ���� � ( � / ���� ����� ��� � ������� /�� � � :���� / / ��� � �� / � ��� �+&������ �( ���!�%�� � �8 �� � � ���+&�� �� ����2F �

� � � � / ������������ %��( ��������� ( � ( ��&"� �� � >8 �� � � � ���!�+&���� / �)(��+. � �� ��9� ���� � �������'%��� � �(�� /!��/ � ����

� � 8 �����( %� ��!�( / ���)( ����� � � ( ���9:��)( % / ����� ������������� �� �!������ � � / ��/ � ����������� / / ( � �� �( $ ��1 �!�+8 ��� $ �� �!�� ��� / ���� ����� &����& � �� ( / ���)( ������� � � ( ���

� 3 ( % ( �� � � � �( %������ (+� ('$ � 1 �GF � � � �"� � �� �! ��� � ���� ��( � / � / � � �!�+&�� �"� / ���)( �"�!� � � � ( ���

PRATICA (Lez. 2)

Autunno 200338

� �!8:?�; � � � 3 = A*,-,�7

� � 69<�!:="���/69?�6�����= �:4 6 � �<���/=� �!47<>=@?�; � =����!4 = � � ; � =

���!?�8:6�?�6 <$;!? � �!? � � =�����= �:; � =:?/�����/=�� � ��<>;�6�����47; � =�� 6� � 69<�!:="���/69?�6 ?�� ��� ���/;�47= ���!49���!4 <%�

�1� ��4��>; ���:;���4����:=�69? � 476 �"� ;�4��>=�� ��; � 694����:= � ���= � ;%�������:476�� �<���/6�� � � =�� =�� �*6������� �$4 ="�/694�������� � � =�84� =@6�# <���<$6947=@; � A 3 ; � � � �<' $

Page 20: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200339

�*6�<�!:=��

robdep@zaffiro:~/Corsi/Reti/C> echocli 127.0.0.1ciaociao ^Drobdep@zaffiro:~/Corsi/Reti/C> echocli 127.0.0.1pippopippo^Drobdep@zaffiro:~/Corsi/Reti/C> ps

PID TTY TIME CMD1077 pts/0 00:00:00 cat

22084 pts/2 00:00:00 bash27162 pts/3 00:00:00 ssh30007 pts/6 00:00:00 bash30331 pts/11 00:00:00 bash30761 pts/11 00:00:00 echosrv30765 pts/11 00:00:00 echosrv <defunct>30767 pts/11 00:00:00 echosrv <defunct>30768 pts/6 00:00:00 ps

Il client viene ucciso

Il client viene ucciso

�� � ���<� � ?��

��� =�?��:=��; � ?�6+�*69<�!:="�

PRATICA (Lez. 2)

Autunno 200340

� =�8:?�;�� 0 ;�?��4� ��4

Prompt > echoserver &[2] 19287prompt > echoclient 127.0.0.1Ciao serverCiao server^DChild 19293 terminatedaccept error: interrupted system call

void sig_child(int signo) {pid_t pid;int stat;

while ( pid = waitpid(-1,&stat,WNOHANG)) > 0) {printf(“ Child %d terminated\n” ,pid);

}}

� � �����!?�;$=�� � =�84� =@6�� =@?�="��� � � =���?����0 =@;�<>; � ; � ;!= � �:=��

Page 21: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200341

3 ? � ��474 � �*=@69?���������� ����.�� � �!< �;��"�

� 8�3(6% +

��3 ? ; � � � ?�=��/=�� � ��<>= � ����.�� � ��< �;��"���/69?�6; � � 69<>; � ="��;�<���? � �>47=�� 0 =@;�<>; � �>=@? ;�� � 47=9?�6

PRATICA (Lez. 2)

Autunno 200342

; ?�; �:6����/=�!:=�� ���/6 � � �*=@6�?/�

for ( ; ; ) {clilen = sizeof(cliaddr);if ( (connfd = accept(listenfd, &cliaddr, &clilen)) < 0) {

if (errno = EINTR)continue;

else {perror(“ accept error” );exit(1);

}}

}

��

;<����� � � � ="��?��>47=�� 0 =@;�<>; � ;�

�� =�8�� � � ="�����?� � ��4747694���# ?/���"� � � ����<%�:=@6��/=�� 0 =@;�<>;%��� = � $

Page 22: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200343

+��<��� � �69?�?�� ���/=�69?����>;���� �<� �

�,�; ��6�?�?��<���/=@69?����:= ����? � ; 8 � % � :�, 3 � ,98�7

�3 ���<� ="��? � ����� �:="����� � ? + � %

�3 ������4 ���!49� 0 =@;�<>;>;���� �<� �

��8�A 5 (/( � :<5 + % 8�7

PRATICA (Lez. 2)

Autunno 200344

% ��47<>=�?�;<�*=�69?������ � ����4 ���!4

�A'6��/; � � � ���<�������>=�� ����4 ����4 � �!4 <$=@?�;%�:4���<$; � � 47;!<���? � ���

� � �� =�����= �/6������ ���<����47="� � 694 ����?�8:69?�6�� 0 = � �/=

� , �9�� � � � �������'%��� � �(�� /!��/ � � ���3 ���<� ="��? � ����� �:="������� � 474 = ��� ���!4 �=�� ; �����!4 ���!4� � %!� �� ���� � ( %���� �+&���� / ��/ � ���� � ( � &�� �+&�� �� ( � / � (���.���

�3 ���<� ="��? � � 0 =@;�< ;$4���;��4� =�? ��� 0 �>47= � 6947?�;8 5 �

� �+( � ��� ��� %�������� ����� � ������� �%� -� 8 �� � � � � ��� %���� /� ����� ����� � ( � �������( � ��������� �� ���

Prompt > echoclient 127.0.0.1CiaoCiaoArrivederciIl server non risponde (dipende dal codice)

Il server viene ucciso

Page 23: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200345

� 3 = 3 3�3�8

�A'6��/; � � � ���<�������>=�� � � =��!? � =@8:?�6947;� � �!474 6�4 �%� � 4���;��4� =�?�������47=����>?������/6����� � ��

� �����( %� ���� � %�� �� � ��� ��� / � (�� � � �%&���� !��� ��� ���� ( ��� ���� !�� ���� � ������ &* ������ ����� � ������ 9(��� �����! �� �%�� D����� � ������'��� �������� � �����3'�,�� �!&

� � ="��?��>8���?��!47;� 6 � ?�����8:?�; � ���:= � 3 = 3 3*3�8

� ��/ %���(�� ���� (������ �� ����� ��� / � ��� ��� / ��� ( � � � � �!��� ��� "� � �( (� � � ( � ���(

�� � � 3 = 3 3�3�8 �$=@8:?�6947; � 6 � � 6�����47;��*=@69?����:=�� 4 = � �>8��!?���47;� � �!474 6�4 �%�:= 8�3 3*3�8

�� 6 � � ��=@69?������!<��4� ="� ��� � � ;!?��:6 ?�69?��/=���� ������4��!;!8�=@4����; ��� � �!474 6�4 �&�' � � � ( � ��� �%$ ��� 4 ��� 4 � ( � / � � � �!� / ��� � ��� 4 , � , �

� A ��%"�&�����������'��2'�����'��3��� ���������� �������� ����%������� �� � � � ���� ���� �3��'��4�������4' *( �� ��( / / ��� � / 6 � ����( � ��� �+� , � , � �� / / ��� ��� ������!� /!� ��� (9� � ����� ( � �

����� �� ����� �%$ � ( � � ����� ����� � %�� ;�(

PRATICA (Lez. 2)

Autunno 200346

� ;���� 0 =�?�;%����4 ����4 ?�69? 47;�8:8:= � ?�8:=�!:=�� �

�7�=����!4 �/6��:; � � �="����4��>=�� �:4 6 � �<���/6�����4 ����4 #�=�? � � �����;<�/6���!?�8:69?�6������ �:= � = ��3�( �/+ � % $

�3 ��� �:="����?�����4����:; ��� ;$4�� � �

�5 �:; ��� ;$<>;<� � 0 =@?�;%���!4 ���!4

��8&% 3 � 8 5 ;'%

�8-, 5 � % ; (*+48 � A*, �98!( 8&% ;.(*+ 8 � A*,

Page 24: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200347

� �!4 ���!49� 0 � � �:6 � ?B;!?�� 4 �<!:696 �

�('69?�� � ���69< � ?�="��;��*=�69?���� � 47;�? � �?� 6�� 0 � � �:6 � ? # ����4 ����4���6 �"� ��8:; � 6+�:; ��� ;�4�� � �$;�� � 47=@<��!? � =������ �:="����� ��3( $

�3 ������4 ���!4 ?�69? 0 ;%�:=��B=�� �/6����� � ;<����4 � 6

�%+A 3.47="���:69?����>;!= ��; � =��6:? � ? + � %

��

+���;��4� =�?/�$4 = � 6947?�;8�A 5 (*(/+48 � 8&%

PRATICA (Lez. 2)

Autunno 200348

� �!4 ���!4 � �/6�<><>; �

void server_somma(int sockfd) {int i, arg1, arg2;ssize_t n;char sendline[MAXLINE], rcvline[MAXLINE];char c;for ( ; ; ) {

if ( (n = reti_readline(sockfd, rcvline, MAXLINE)) == 0)return; /* connection closed by other end */

/* legge dalla stringa passata dal client i due interi da sommare */

if( sscanf(rcvline, "%d %d" , &arg1, &arg2) == 2 ) /* converte il risultato in stringa e lo scrive nel

buffer */sprintf(sendline, "%d\n" , arg1 + arg2);

else sprintf(sendline, " input error\n" );

n = strlen(sendline);reti_writen(sockfd, sendline, n);

}}

sommasrv.c

Page 25: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

PRATICA (Lez. 2)

Autunno 200349

A � ="��? � � �/69<><$;��

��39��; � =�=@?&;�4747=�� 6���;�� �/6����� �

�39��; � = �:=@8:= � ; � = ��; ��� � � � ��? � �$;��"� ; � ;<� � =���47;

��3 5 < � � � ="�4� � � =�?�8

�� � � � � �

���/69<$<>;<�<� =�'��

PRATICA (Lez. 2)

Autunno 200350

35476�!4� ��<>;

sunos5 > sommacli 206.62.226.3311 2233-11 -44-55

bsdi > sommacli 206.62.226.3311 2233-11 -44-16542537

��; ?�; � �:;!4��%� � ;�� � 4 ;�3 ? � � �

Page 26: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*0�"*��)+� �� 12�

� �� � � � �

PRATICA - Lezione 3

52PRATICA (Lez. 3)

Autunno 2003; 7 3

��

%+4 ;����:694 � 6 6947="��? � ; � 6 ; ��� ; ��6�?�?��<���/=@69?�� ��;���� =��:;�!:= � �

��

� ��?��*; �69?�?/�<���/=@69?���� =�?:;<� � =��:;�!:=�� �

��7/( �

�( � �

�� ( � 3

Page 27: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

53PRATICA (Lez. 3)

Autunno 2003� � ?��*=@69?�=����!4 = �/6����� �

socket()

bind()

recvfrom()socket()

sendto()

recvfrom()

sendto()

close()close()

������� � ���"�� ����� � #��� ��� � � ��� � ��� ��

��� ��� � � ��� � �� ��CL

IEN

T

SE

RV

ER

% =��:="�;>=@? � �!47;<�*=�69?�������4 = ���:476 � 6���6 ��� 6�; 7 3

�������� � ���"�� ����� � #

54PRATICA (Lez. 3)

Autunno 2003� ��� �:=�4����>47=���� ���!4 ���:; � ;�8:47;�<><>=

� =@?��<� � ��� � ��.�� � �/6������ ' 0 �

=�? � 4 �<����� 4769<�# =@? � � 69= ��� � =�? � ��=�? � � � � 4 � � ��/6��� ;��/�:4�� � �/6���/� ��? � � �4� ��?�$��=�? � ����?�� � 6�# =@? � �69?�� � � 69=���� ��=�? � ��= ? � �

�69?�� � � � 4 � � � �/6����;<���:4�� � �/6���/� ��? � � � ��?�$��

�;�� 694����:=947= � 6947?�6 � &2�����!4 47694����4!�. � �?� � �1� =96����4 = �1� = ����5��

��

� ��/ � (���.������������ � %��( �� ������ ���"�������� ����� � ( � /��� �� � ��� � � �� �� / � �"����� �� / � / "����&��'& & �������������� ���� � ��� �

� : � ����4 694 ;� $ ���� � �� ( ���+&���� � � ��� � ( � / ��� �� & � ( ����� � � �� ������� & � �(+(

�6

� � %������ ��� � ��� ( / ��� ��� !� �� ����&�� �"� � ����� ����� / � (��+.���) � /�� ��� 1 � � ���������� ����� ( � ��� � � ����� / / � � �� &�� ( ���� � � �'���'*��"�� � �!� ��� �%� �� &*���#��� �%� ����� � � �����������'��2�� �&�'*� �#������!�%�%����

�!�����3� ������'�� 9������3�����'*�%����� �$���� � � �� / � ��� / �� / � ��� �� %!� � �� ��� ����� � ��� � � %�

Page 28: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

55PRATICA (Lez. 3)

Autunno 2003� ��4 ����4 � � 0 6��69?�; 7 3

int main(int argc, char **argv) {int sockfd;struct sockaddr_in servaddr, cliaddr;if( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )

err_sys("socket error" );bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(PORT);

if( bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 )err_sys("bind error" );

server_echo_udp(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr));}

void server_echo_udp(int sockfd, struct sockaddr *p_cliaddr, socklen_t clilen) {int n;socklen_t len;char mesg[MAXLINE];for ( ; ; ) {

len = clilen;if( (n = recvfrom(sockfd, mesg, MAXLINE, 0, p_cliaddr, &len)) < 0)

err_sys(" recvfrom error" );if( sendto(sockfd, mesg, n, 0, p_cliaddr, len) != n )

err_sys("sendto error" );}

}

echoudpsrv.c

56PRATICA (Lez. 3)

Autunno 2003A � =��!? � � � 0 6��69? ; 7 3 # & $

#include "basic.h"#include "echo.h"

int main(int argc, char **argv) {int sockfd;

struct sockaddr_in servaddr;

if (argc != 2)err_quit("usage: udpclient <IPaddress>" );

bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_port = htons(PORT);inet_pton(AF_INET, argv[1], &servaddr.sin_addr);

if( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )err_sys("socket error" );

client_echo_udp(stdin, sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));

exit(0);}

echoudpcli.c

Page 29: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

57PRATICA (Lez. 3)

Autunno 2003A � =��!? � � � 0 6��69? ; 7 3 #���$

void client_echo_udp(FILE *fp, int sockfd, const struct sockaddr *p_servaddr, socklen_t servlen) {

int n;char sendline[MAXLINE], recvline[MAXLINE + 1];char buff[MAXLINE];socklen_t len;struct sockaddr *p_replyaddr;

p_replyaddr = malloc(servlen);

while (fgets(sendline, MAXLINE, fp) != NULL) {sendto(sockfd, sendline, strlen(sendline), 0, p_servaddr, servlen);len = servlen;

if( (n = recvfrom(sockfd, recvline, MAXLINE, 0, p_replyaddr, &len)) < 0 )err_sys(" recvfrom error" );

if( (len != servlen) || memcmp(p_servaddr, p_replyaddr, len) != 0 ) {struct sockaddr_in *sin = (struct sockaddr_in *) p_replyaddr;err_msg(" risposta da %s ignorata\n" ,

inet_ntop(AF_INET, &sin->sin_addr, buff, sizeof(buff)));continue;

}

recvline[n] = 0;fputs(recvline, stdout);

}}

58PRATICA (Lez. 3)

Autunno 2003A'69? � 476 ��� 6�� � ��<>= ��� �!? � �

�%+;�� ����; � ;�8:47;!< �;�4�� !�!��>=�? � ��4��:47; � ; � 6��69<%�?� ;47=����:6 � � ;%����������4 ���!4

��

35476�� ;�4��>;��4���;�4 � � ?�; �/= � � ;��*=@69?���������8���?��!4 ��

� � ���/= � 6�� � �$=����6��:= �����:=������<�:=������ �4�:84'���

, ���� �������� � � %!� � � � �� "� ������ � � �� ��� � � ( ���� % ( � ��%,�3 ,

Page 30: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

59PRATICA (Lez. 3)

Autunno 20037�; � ;!8:4 ;!<$<>=�����4�� � � =

��

3 �!49�<����<��:=�6 � ?B476 � � �!4 � 6�! � �1� ; � =@;

�3 ? ; � � � ?�=���;<�/=9?�69?�!�;<� � ;

�('69?��/;<���:=�;!<>6����$=���<�� ���/;!8:8:=�6���� ���<� ="��? � ?�69? �><>;�=;�474 = � ; � 6 ;�� ���!4 ���!4 6 ��� � 4������� ;$47="���:6�� � ; ��� �����94 ���!4?�69? �>;�4 47= � ; � ;$;����<� =���? �

�3 ? ; � � � ?�=���;<�/=�# � ��' � 47;�? �/;��*=@6�?�= !:;!?/�;!47=��<$ � ;�< 6 � � ;�:="��� ��4���?��*;

60PRATICA (Lez. 3)

Autunno 2003A'69?�?�� � � �%; 7 3

��

� 6����� � ; 7 32�69?�?�� ���/6�

� 6����� � ; 7 3 ?�69?��69?�?/�<���/6

Page 31: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

61PRATICA (Lez. 3)

Autunno 2003� 6����� � ; 7 32��6�?�?��<���/6

�('69?��/= � �/;%����?�� � 6 <>; � 47= � �>6�����?��

�39��;���� 0 � �1� =�����474 ;!?�6 ; � � 69<>; � =���;�<���? � �%����� �:= � =; ��� � =�?��:=@47=�� ��6������ �=�� =���; � 6 ?������ ; � 0 =�;!<$; � ;$;%��69?�?/�<� �

�('69?��/= � �/;$4�� ����� 4 6�< ��<>;%�/= � �/;�4 �!;<�B6 4���;����

�A'= � � =@<$= � ; � ? ���!4 ���!49; 7 3 ;��69< � ?�=��;!4����69? � ? �/6 � 6�<� ="��? �

��; ?��/6����� � ; 7 3 ?�69?��69?�?/�<���/6 ?�69? � ��� �69? � 476 �"� ;�4���!4 476947=9;��/=@?��4769?�=

62PRATICA (Lez. 3)

Autunno 2003�69?�?�� � �

���;�<�!:= ;�4 �� � =@?��:=@47="� �*6+�69? � � =��/=�� � 6 � ��6�< � ?�="�;!4��

�7�=����69?�?�� �1� ��4��>=����/6����� � # ����� �="� ="��;�?��:6 � � �4;.( � 3�8 A�69<��%� ;�<>=@84� =@; �:=��:4 6 � 6��6 ��� =9?�� ���;�<��:6��/=@? �4� ;�<>=�� .�$�

,(� � � �"������� �( ������� � / 6 � ����( � �%� ��� � ��, , , -* $ ���� ( � : ��

%���( � / �� ��

Page 32: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

63PRATICA (Lez. 3)

Autunno 2003; 7 3 �<� =���? � ( ���!4 �/=�69?����/69?�?�� � �

void client_echo_udp_conn(FILE *fp, int sockfd, const struct sockaddr *p_servaddr, socklen_t servlen) {

int n;char sendline[MAXLINE], recvline[MAXLINE + 1];

if( connect(sockfd, (struct sockaddr *) p_servaddr, servlen) < 0 )err_sys("connect error" );

while (fgets(sendline, MAXLINE, fp) != NULL) {

write(sockfd, sendline, strlen(sendline));

n = read(sockfd, recvline, MAXLINE);

recvline[n] = 0; /* null terminate */fputs(recvline, stdout);

}} echoudpcli-connect.c

64PRATICA (Lez. 3)

Autunno 20033 ?�;���� =��:;�!:=�� = ��� �:=�; 7 3

�3 ������4 ���!4 47=����������:; � ;!8:4 ;�< ������<��4� =�����<%��? � �?� = �69? � ;�

, �� ��� ���� ��� ���������(���( � ( � * $ * � * �G6 �>6 "� ������( � ��� ����� ��� / ���+&������ % / � � �� ������������ %��98 ����� ���������� � �� � ( � (���������� � ��� � �

�3 ���<� ="��? � ����� �:="����� � ? ���!4 ="���:=��:;���� 0 � ��� = �4���!?��*;;������ ��� ;�4 � ; � � � ?�;$47=����:6 � � ;

Page 33: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

65PRATICA (Lez. 3)

Autunno 2003; 7 32� � 0 6�����4 ���!49�6 � ? � # & $

#include "basic.h"#include "echo.h"

void server_echo_udp_count(int sockfd, struct sockaddr *p_cliaddr, socklen_tclilen);static void gestisci_interrupt(int signo);

int count = 0;

int main(int argc, char **argv) {int sockfd;struct sockaddr_in servaddr, cliaddr;

if( (sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0 )err_sys("socket error" );

bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(PORT);

if( bind(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0 )err_sys("bind error" );

signal(SIGINT, gestisci_interrupt);

server_echo_udp_count(sockfd, (struct sockaddr *) &cliaddr, sizeof(cliaddr));}

echoudpcli-count.c

66PRATICA (Lez. 3)

Autunno 2003; 7 32� � 0 6�����4 ���!49�6 � ? � #���$

void server_echo_udp_count(int sockfd, struct sockaddr *pcliaddr, socklen_t clilen) {

int n;socklen_t len;char mesg[MAXLINE];

n = 240 * 1024;setsockopt(sockfd, SOL_SOCKET, SO_RCVBUF, &n, sizeof(n));

for ( ; ; ) {len = clilen;recvfrom(sockfd, mesg, MAXLINE, 0, pcliaddr, &len);count++;sleep(1); /* rallentiamo il server */

}}

static void gestisci_interrupt(int signo) {printf(" \nDatagrams ricevuti: %d\n" , count);exit(0);

}

Page 34: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

67PRATICA (Lez. 3)

Autunno 2003; 7 32� � 0 6��<� ="��? � �6 � ? �

��

A';�<�!:=�;%�/6 � 6 � ;%� � ?/��=@69?/��� 0 ������� �:="��� �$=��:; � ;�8:4 ;!<

#define NDG 2000 /* #datagrams to send */#define DGLEN 1400 /* length of each datagram */

void client_echo_udp_count(FILE *fp, int sockfd, const struct sockaddr *pservaddr, socklen_t servlen) {

int i;char sendline[MAXLINE];

for (i = 0; i < NDG; i++) {sendto(sockfd, sendline, DGLEN, 0, pservaddr, servlen);

}}

echoudpcli-count.c

68PRATICA (Lez. 3)

Autunno 20038�474 6�4 =�?�6�? ���!8:?�; � ; � =

robdep@zircone:~/Corsi/Reti/C> netstat -s | grep -C4 "Udp" | tail -5; Udp:

6686 packets received2012 packets to unknown port received.9674 packet receive errors18634 packets sent

robdep@zircone:~/Corsi/Reti/C> echoudpsrv-count

Datagrams ricevuti: 11

robdep@zircone:~/Corsi/Reti/C> netstat -s | grep -C4 "Udp" | tail -5; Udp:

7206 packets received2012 packets to unknown port received.11154 packet receive errors20634 packets sent

Client in un’altra shell; dopo un pòCTRL-C

robdep@zircone:~/Corsi/Reti/C> echoudpcli-count 127.0.0.1robdep@zircone:~/Corsi/Reti/C>

Page 35: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*0�"*��)+� �� 12�

�� � � � �� �� � � ��

PRATICA - Lezione 4

70PRATICA (Lez. 4)

Autunno 200335476�!4� ��<>;

�� � ;�?��:;!4��B=@?�� � � #�� ��8:8��!4 ���:; � ;�� � =��!47; $

�; ?��/6����� � # � ��8:8��!4����:;�� �/6 � �� � $

�('69?��:6 � ��� ;� �!8:8���4��>=�� ��3(*� � ���/6 � �� �

�3 ���:47=@<>6�� 0 ���:476�� � ������; � =�� =��!?/�� � ��� 6

Page 36: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

71PRATICA (Lez. 4)

Autunno 2003� 6�������� = �:=�3 � 5

� � ;�47=9<>6�������� = �:=�3 ?�� �� � 5 � � � � �

&�'��/ (���.�� ����4' �+( ��� / (���.�� ���� ' � �� � / � % / �GF � ����4' 4 �� �����(9����� ���� ��� / ��4' � � � ����� ( � (

�� =@?��4769?�6 � =����:476����<���/6��/=�!4� 6�����;�# � � ;�?��:6�� 0 =@;�< ;� � 6 ����47;<��=@69?����:= � � ��� � 4 ;�$)� =@?�6 ;��"� ; ��69?��<� � �/=�69?��������� � 6����!47;<�*=�69?��

�3 ? � ?�;$6 ����47; �*=�69?����:= � � �1� � 4 ; ��; � ? ��;�?�; � �%�:=�3 � 5�:6����/=�;!<$6��:=�� � =�?�8 � �!4���� � ��� ;��/=&�' � ������ %���� ���"� ����� %���� ������ /+.�������� /�4' *

( %�� ����������������"� /+. � ���!� / � / %"��(�� ���� (��+&����������� �� ��� / �

sincroni

72PRATICA (Lez. 4)

Autunno 2003:�� 6��� =@?�8+3 � 5

applicazione kernel

RecvfromSystem call Non ci sono

datagram pronti

datagram pronto

Copia datagram

Copia completataProcesso continua (elabora il datagram)

BL

OC

CA

TA

Ritorna OK

FASE 1: attesa

FASE 2: copia

Page 37: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

73PRATICA (Lez. 4)

Autunno 2003(�69?�!4� 6��� =@?�8+3 � 5

applicazione kernel

Recvfrom System call Non ci sono datagram pronti

datagram pronto

Copia datagram

Copia completataProcesso continua (elabora il datagram)

BL

OC

CA

TA

Ritorna OK

FASE 1: attesa

FASE 2: copia

EWOULDBLOCK

EWOULDBLOCK

System call

System call

Recvfrom

Recvfrom

74PRATICA (Lez. 4)

Autunno 20033 � 5 < � � � ="�4� ��� =@?�8

applicazione kernel

selectSystem call Non ci sono

datagram pronti

datagram pronto

Copia datagram

Copia completataProcesso continua (elabora il datagram)

BL

OC

CA

TA

Ritorna OK

FASE 1: attesa

FASE 2: copia

System callRecvfrom

BL

OC

CA

TA

Ritorna “ pronto”

Page 38: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

75PRATICA (Lez. 4)

Autunno 20033 � 5 8 � =��:; � 6���;�=�����8:?�; � =

applicazione kernel

signalSystem call

datagram pronto

Copia datagram

Copia completataProcesso continua (elabora il datagram)

BL

OC

CA

TA

Ritorna OK

FASE 1: attesa

FASE 2: copia

System callRecvfrom

SEGNALEGESTORE SEGNALE

Non ci sono datagram pronti

76PRATICA (Lez. 4)

Autunno 20033 � 5 ;��/=@?��4769?�6

applicazione kernel

aio_readSystem call

datagram pronto

Copia datagram

Copia completata

FASE 1: attesa

FASE 2: copia

SEGNALEGESTORE SEGNALE

Non ci sono datagram pronti

Processo continua (elabora il datagram)

Page 39: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

77PRATICA (Lez. 4)

Autunno 2003� � ?��*=@6�?/�%��� � � � �

� � �!� / ����� � ����� �� / ��� #" &��� � �!� / ����� � ����� �� �� " &��� �� �� / ��� #$ � �!41 ��� � ��5� � ����� ����� �� � �� � ��������� � � �0�� �

� � ��������� �0��� � � � ���� � �� ( ��� � ��� �� � �� ����/ � � 1 � ��� � (��� � / ( � ��� ����� �( ��� (��- �" � ��� ����( � � # ��� � �� ( !) � � �����( � � �"� � ����� ��( � � %���( �! �

� ��� �� � ������ // ( ��� ��������� �/ ( ��� ���� ��������

78PRATICA (Lez. 4)

Autunno 200335;!47;�<�� � 47=���� � � � �

�%+=@<��!6 � �&�' , �������( � ��� / / ( � ��� %�������� � � &�� � ��'( � $ � � � ( � �+&��� ��

���������� ��( � �9: %���( ���(+(�4'�� �� �� �� ��� ( �� "� � ��'( � � ( � &����( � ��� %�������� � � ( � / �� �'( � % ( ����� �( ������������&������� ( � ����� ( � (9�������� � ��( � � %���( ����� A ���������%� ��'���%� �&�'*�%������� ��� ����3���!&�� ����'������'��� ����� ��"����*� �!�3�����

�����'���'��� ����'��&�"�� ��� ��� �� ���) �*&�� ���3'��%����'��� ��� A � ��"����!�%� ������&�� � � ��"#76& '� �� ��� ����('*� ��4���3"��$��"��3 ��� &���'�"#� 9�!� ��� �

����& ��'*�:� &�������������!& '�&����#��'� �������� ��'�����'+!� '

�� �� �� �� ��� ( �� "� � ��'( � %!����� ��# � � ( � � �'%�������� � ��� �( � ���� � �� � � ����� �� �!��%$ % (�/ / � ��� (

��/=�� ����� ���47=�� � 6949�:;%��6�? � 4 6 ��� ;�4��� *��������� � %���( �� � %���� / � / ��� "� �� 8 ��� ������ � %���( �� � %���� / ��� ����� � "� �� �*F�� � %� � ( �!��� � �)( � � � & � ( ��� %�� � � � ( / �����

� A ���3� 9('* ��� �������"�'��3��,���� � �%"2"(�2�'����.��� ? �#��'���&���� '����! �����'������3'�� � '� ��"��('*������"� �' �����&�� ���� �

Page 40: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

79PRATICA (Lez. 4)

Autunno 200335;!47;�<�� � 47=���� � � � �

�3 �!49���<����47= ����47=984� =�=@?��/=���<>=��/= � �/; � ;%� � 4 � �1� � 47;%�1� �4��� � � 0 � �� ?B=@?��/=��!<%���:=�!:= �

� � ( � �'�3 ��� � *+ -$ � � ��������� ���� � (��� A ��%���3 � �������"��$��"�����)�����&(

� � ( � �'�3 ��� � $ $ � �� � ��� � ��� � ���� ��� � (���

� ��$���� )*� ��,�� � �:��� ��� 9�'2������ � �* ����%����� ����'����)�� � ( � �'�3 � * � *�$ � �� � � � � ��� ������ ��� � (��

�� ��$���� �*� ��,�� � �:��� ��� 9�'2������ � �* ����%����� ����'����)�

� � �� � 3 ��� ����� $ $ � �� � ��� � ��������� �� � (��� '������3'�� � ��%� � ��,�� � �3�!� ��� 9('*!�%��� � � ��!�%����� ����'����)�*1��)

�,�; ��6 � � ;!? � � �<7 � � 8% � 3 � 8 # ��� � � �

� ' 0 $ �>=���? � <���476��:=���<����47= �1� 6�4 =�=@?���� �4��� � # �/64� = � ;�<��!? � �?& : � ��$

�<>; ��� �6� �$=���? � <���476 <>;����/=@<$6��:=���� ���47= ��� 6947=�<��� � � =�� ;�<���? � � � �/; � =� , ����( %���� �� � � ��� � � &����� /+.���� ��� /� �!�"������� �� ( � ������ ������ � �������������� ��( ��� "� �+��� ��GF�� � �������

��� / � � ��" #9$ � � � / ���������� � %��( � � ��� & � ��� ( �"��#�(

80PRATICA (Lez. 4)

Autunno 200374�<����47= �1� 6�4 = �:4 6�? � =

�� � � ;!?��:6�� � � ;�� <���?�6 � ?�!�.

� ���:; � ��8:8��!4��� ����� (�� / � ����� %� *� � �� ���� ��� ���)( � / � ( % & � ( �����"� � � (���.���

�3 ���/6����� � ��� � ; � 6+� 0 = � �/6 =@? � � ��� � 47;� �!�"G:������( ��� � ��� ��( � /+� ���� ��6 ( %���� � &�� ( ����� � / ��� �� ����� �( � ���%�� �

�3 ���/6����� � � � ? � � =�� � �!?�=@?�8 � �/6����� � ���=��/6�?�6+������� ��69?�?�� ���/=�69?�=��69<��4� � � ; � �

�A � � � ?���4747694��� ��6 ( %���� � &�� ( ����� � / ��� �� ����� �( � ����� �� �" ��������� ( �'%������ ��� �&���� �

/ 6 ������( � �

Page 41: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

81PRATICA (Lez. 4)

Autunno 200374�<����47= �1� 6�4 = �:4 6�? � =

��3 ��? � <���476��:=�!�. � ���:=�����;<��=@6��:=�����69?�="!:=�� �$?/����! � � ���!49�������!4 ?���� �><>;�8:8:=@694����:= � : ���� ����� (�� / � ����� %� *� � �� ���� ��� ���)( � / � ( % & � ( �����"� � � (���.���� ��6 ( %���� � &�� ( ����� � � ����� � "� ����� �( ������� /��" � �����( � ���!����

�� � ��� � ���� ������� %������� � � / / � � � / / ( � � � ��� % ( � �(�3 ���/6����� � ��� � ; � 6+� 0 = � �/6 =@?�����47= �1� � 47;� , � 6 ( %!� � �'&�� ( ����� � ������ �� �� ��� ������� ����� 4 , � , �

�A � � � ?���4747694��� ��6 ( %���� � &�� ( ����� � � ����� � "� ����� �( ������� �� �" ������� � ( � %������ � � �+&�� � �

/ 6 ������( � ��

� � 4747=�� 6��:=��:;� =�� � 6947=�!:;�? �:;

82PRATICA (Lez. 4)

Autunno 2003�<� 0 6 � � =��!? � ( ���!4��/=@69?���� ��� �<� � #�& $

void client_echo_select(FILE *fp, int sockfd) {int maxfdl;fd_set rset;char sendline[MAXLINE], recvline[MAXLINE];int n;

FD_ZERO(&rset);for( ; ; ) {

FD_SET(fileno(fp), &rset);FD_SET(sockfd, &rset);maxfdl = MAX(fileno(fp), sockfd) + 1;if( select(maxfdl, &rset, NULL, NULL, NULL) < 0 )

err_sys("select error" );

if( FD_ISSET(sockfd, &rset) ) {if ( (n = reti_readline(sockfd, recvline, MAXLINE)) < 0) {

if( errno == EPIPE ) {err_msg(“ %s [%d]: server disconnesso“ , __FILE__,__LINE__);break;

}else

err_sys(" readline error" );}

echocli-slct.c

Page 42: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

83PRATICA (Lez. 4)

Autunno 2003�<� 0 6 � � =��!? � ( ���!4��/=@69?���� ��� �<� � # ��$

if (n == 0)err_quit(“ %s [%d]: server disconnesso“ ,__FILE__,__LINE__);

fputs(recvline, stdout);}if( FD_ISSET(fileno(fp), &rset) ) {

if( fgets(sendline, MAXLINE, fp) == NULL) return;

if( (reti_writen(sockfd, sendline, strlen(sendline))) < 0)err_sys("write error" );

}}

}

�3 ���<� =��!? � 47=�� �����>;�8�� � � =@4 ���/=@; � � =@?�� � � ��; � ;�� � ="��47;�� 0 �?� � =�?/� � ��:; ���/6����� �

�� �>=�� ����4 ����4 � �!4 <�=@?�; � ="��?��������<�:= � 6 � ? 8 5 � � � ���/6����� �

� ��/ � / � ���� / ( ��� � ������������� �� ��� / ��� ( � �������� ( �!�� ����� & ���� / ��� � /�� / � ���! � ����� ���� ����������� � ( � �( � ( % (

84PRATICA (Lez. 4)

Autunno 2003� � 0 6��<� ="��? � ������� �<� �

Data o EOFstdin

RST FINdata

socket

Client

TCP

Page 43: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

85PRATICA (Lez. 4)

Autunno 2003� � 6��� ;!?��� � ;!= �

��

� ��� �:="����� � ?�; � =�?/�!;%�:=9=�?�� � � ���/=�!4� 6 � ��;$=�? ; �1� ���/;������� ;�47=����:6�� � ;���� �����!4 ���!4 � � 0 6

C

S

Tempo 0

dati

Tempo 1

dati

Tempo 2

dati

Tempo 3

dati

S

Tempo 4

echo

Tempo 5

echo

Tempo 6

echo

C

Tempo 7

echo

86PRATICA (Lez. 4)

Autunno 2003:!; � � 0 =@?�� � �

CTempo 0

d1

Tempo 1

d1C d2

Tempo 2

d1C d3 d2

STempo 3

d1C d4 d3 d2

S

Tempo 4

r1d5 d4 d3 d2C S

Tempo 5

r1 r2d5 d4 d3d6C

SS

Tempo 6

r1 r3r2d5 d4d6d7C

SS

C

Tempo 7

r1 r4r3r2d6 d5d7d8

SSC

Page 44: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

87PRATICA (Lez. 4)

Autunno 2003� 0 � � �:6 � ?���� ��� ;%�69?�?�� ���/=�69?��

�A'=��:6 ���/69?�6�� ������4 ;�?/�6947; ��; � =�=@?&;�4747=�� 6

�� ��� �:=�4��>=�� ��3(*�/6 � 6 =@? � ?�; �:=@4�� �*=�69?��

� =@?��<� � ��� � ��.�� � �/6������ ' 0 �

=�? � � 0 � � �:6 � ?�#�=�? � =@? � $ �

� ; � 694����:=�4 =� 6947?�6 � & ���%��4747694�� � : ����5��

0 6 � � 6 � ,4;'% � +47 � � ,4;'% ��� + � � ,4;'% � +47�� +

88PRATICA (Lez. 4)

Autunno 2003� � 0 6��<� ="��? � ( ����4��/=@6�?/�%� 0 � � �:6 � ?

void client_echo_shutdown(FILE *fp, int sockfd) {int maxfdl, stdineof;fd_set rset;char sendline[MAXLINE], recvline[MAXLINE];int n;

FD_ZERO(&rset);for( ; ; ) {

FD_SET(fileno(fp), &rset);FD_SET(sockfd, &rset);maxfdl = MAX(fileno(fp), sockfd) + 1;if( select(maxfdl, &rset, NULL, NULL, NULL) < 0 )

err_sys("select error" );

if( FD_ISSET(sockfd, &rset) ) {if ( (n = reti_readline(sockfd, recvline, MAXLINE)) < 0) {

if( errno == EPIPE ) {err_msg("%s [%d]: server disconnesso" ,__FILE__,__LINE__);break;

}else

err_sys(" readline error" );}

echocli-shtd.c

Page 45: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

89PRATICA (Lez. 4)

Autunno 2003� � 0 6��<� ="��? � ( ����4��/=@6�?/�%� 0 � � �:6 � ?

if (n == 0) {if( stdineof == 1 )

return;else {

err_msg("%s [%d]: server disconnesso" ,__FILE__,__LINE__);exit(-1);

}}fputs(recvline, stdout);

}if( FD_ISSET(fileno(fp), &rset) ) {

if( fgets(sendline, MAXLINE, fp) == NULL) {stdineof = 1;shutdown(sockfd, SHUT_WR);FD_CLR(fileno(fp), &rset);continue;

}if( (reti_writen(sockfd, sendline, strlen(sendline))) < 0)

err_sys("write error" );}

}}

90PRATICA (Lez. 4)

Autunno 2003� � � � � � ����4 =�� ����4 ����4

�� � � �<� � � ��� � ��8:8��!4����:; � � ��� =9=��<� =���? � �69?�?�� ���/=

�� � 474 ;�. 4����

� � �69? � ="��?���� =�� ����� ���47=�� � 6949���!=��/6����� �� � =�� =�� ��; � =��:;������!4 ����4 # �/=@;� =�� � ��?�=@?�8+� 0 ���69?�?/�<���/="$

� � 474 ;�. �<� =��!?� � �69? � =��!?/�$=@? � �!4 = � 0 �>=�?��:=��;!?�6�� �

-1

-1

-1

-1FD_SETSIZE-1

1

2

3

client

0 0 0 0 0 0 …fd0 fd1 fd2 fd3 fd4 fd5

rset

Page 46: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

91PRATICA (Lez. 4)

Autunno 2003� � 4 � �1� � 4 �%�:; � =�����4 =������!4 ���!4

�� � ���:69?�=@;�<>6�� 0 �>84� =�� � ;!?��:;�4 ��� =�� �%�/=@;�?�6 ;�����4 � =���� 0 �=������ 47= � 6947?�; � 6���; � =�� � ��?��/=@; �

�%+;�� �>=@?�� 6947<>;<��=@69?������!4 4 � <���<>6�4 ="� �*; � ;>=�? 4���� �

� � �"� � =@?�=���=@6�� � ���/6 � 6 =���=�� � =��� ��?�=@?�8+�/6����� � �4� � � � �

� � � =@?��:=9=����:;!47;�<��� 476 < ; ��� ���:= ��� � �<� � ��� �����<��� ��4 � �

0 0 0 1 0 0 …fd0 fd1 fd2 fd3 fd4 fd5

rset

92PRATICA (Lez. 4)

Autunno 2003� � 4 � �1� � 4 �%�:; � =�����4 =������!4 ���!4

� � � ;!?��:6 � ?�� � =��!?� � � ;�!:=�� ="��� � � ?�; ��6�?�?��<���/=@69?���� �!474 �

�4���; � 6 � ?��/6����� � ����4 � ;%��6�?�?��<���/=@69?����69? � ; � � ?��*=@6�?/�;���� �<� �

� � % % ( ��� � (��&!��� / � � ��� �( ���!���( :��

�7�=9? � 6 � 6 =������!4 ���!49� 0 =@;�<>; ��� � �<� � ����4 � �!8:8���4����:; � � ��� =9=�/6����� � # � =�� ����� ���47=�� � 694 $ ;�����4 � =� � ����� � ( � ( � !��� (��+.���) � � ��� $/ � � ���� � �!��( ��� �9� $ �)( � �!������ ( ���(�

� �� � � ��� / %���� �� ������( ��GF�� �9� � � � / ��� �"� ����� � ���� ���

0 0 0 1 1 0 …fd0 fd1 fd2 fd3 fd4 fd5

rset

4

-1

-1

-1FD_SETSIZE-1

1

2

3

client

Page 47: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

93PRATICA (Lez. 4)

Autunno 2003� � 4 � �1� � 4 �%�:; � =�����4 =������!4 ���!4

�� � ���:69?�=@;�<>6�� 0 � � ? ; � � 476��<� ="��? � �/=��69?�?�� ��� ���6� �!4 4 ��4���; � 6 � ?B? � 6�� 6��/6 � �� �

� � % % ( ��� � (��&!��� / � � ��� �( ���!���( :��

�7�=9? � 6 � 6 =������!4 ���!49� 0 =@;�<>; ��� � �<� � ����4 � �!8:8���4����:; � � ��� =9=�/6����� � # � =�� ����� ���47=�� � 694 $ ;�����4 � =� � ����� � ( � ( � ��� (��+.��� ��� -� � � $�/ � ������� ����(� ��� � � ��� � � %���� / �� ����)( �"����� � � ( ����

� �� � � ��� / %���� �� ������( ��GF�� �9� � � � / ��� �"� ����� � ���� � �

0 0 0 1 1 1 …fd0 fd1 fd2 fd3 fd4 fd5

rset

4

5

-1

-1FD_SETSIZE-1

1

2

3

client

94PRATICA (Lez. 4)

Autunno 2003� � 4 � �1� � 4 �%�:; � =�����4 =������!4 ���!4

�� � ���:69?�=@;�<>6 6947;�� 0 �?� ;��:47=�<>;%��69?�?�� ���/=@6�?/�%# � � � �"� ;%� 0 �� �/;%� � ��$ ����?�8:;�� 0 = � �/;

�3 ������4 ����4 � 0 =@;�<>;%����� � � � ���!4 � ��8:8���4����:; � � �1� =:=��6����� � # � =�� ���� ���47=�� � 694�$ ;<���!4 � =� � ����� � ( � ( � ���� (��+.��� �� � ���9$�/ � ��� � � ����(� ��� ���$ �)( ������� � � ( ���(�

� �� � � ��� / %���� �� ������( ��2F � �9� � � � / ��� ���������������� � �

0 0 0 1 0 1 …fd0 fd1 fd2 fd3 fd4 fd5

rset

-1

5

-1

-1FD_SETSIZE-1

1

2

3

client

Page 48: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

95PRATICA (Lez. 4)

Autunno 20038 � 0 6�����4 ����4 ����4��/=@6�?/�%� � � � � � #�& $

int main(int argc, char **argv) {

int listenfd, connfd, sockfd;int i, maxi, maxfd;int ready, client[FD_SETSIZE];char buff[MAXLINE];fd_set rset, allset;ssize_t n;struct sockaddr_in servaddr, cliaddr;socklen_t cliaddr_len;

if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)err_sys("socket error" );

bzero(&servaddr, sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = htonl(INADDR_ANY);servaddr.sin_port = htons(PORT);

if( (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0)err_sys("bind error" );

if( listen(listenfd, BACKLOG) < 0 )err_sys(" listen error" );

echosrv-slct.c

96PRATICA (Lez. 4)

Autunno 20038 � 0 6�����4 ����4 ����4��/=@6�?/�%� � � � � � # ��$

maxfd = listenfd; /* inzializza il numero di descrittori */maxi = -1;for ( i = 0; i < FD_SETSIZE; i++) client[i] = -1; /* inizializza l'array client a -1 */FD_ZERO(&allset); /* inizializza a zero tutti i descrittori */FD_SET(listenfd, &allset); /* setta il descrittore di ascolto */for ( ; ; ) {

rset = allset; /* insieme descrittori da controllare per la lettura */if( (ready = select(maxfd+1, &rset, NULL, NULL, NULL)) < 0 )

err_sys("select error" );if( FD_ISSET(listenfd, &rset) ) { /* richiesta ricevuta dal listening socket */

cliaddr_len = sizeof(cliaddr);if( (connfd = accept(listenfd, (struct sockaddr *) &cliaddr, &cliaddr_len)) < 0)

err_sys("accept error" );for(i = 0; i < FD_SETSIZE; i++)

if( client[i] < 0 ) { /* cerca il primo posto libero per il nuovo il descrittore */client[i] = connfd;break;

}if( i == FD_SETSIZE ) err_quit(" troppi client" ); FD_SET(connfd, &allset); /* setta connfd per la select */if( connfd > maxfd ) maxfd = connfd; /* aggiorna maxfd */if( i > maxi ) maxi = i; /* aggiorna maxi */if( --ready <= 0 )

continue; /* se non ci sono altri socket pronti riprendi da select */}

Page 49: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

97PRATICA (Lez. 4)

Autunno 20038 � 0 6�����4 ����4 ����4��/=@6�?/�%� � � � � � # � $

for( i = 0; i <= maxi; i++ ) {/* controlla tutti i socket attivi per controllare se sono leggibili */

if( (sockfd = client[i]) < 0 ) continue;

if ( FD_ISSET(sockfd, &rset) ) {/* se sockfd è leggibile invoca la readline */if ( (n = reti_readline(sockfd, buff, MAXLINE)) == 0) {

/* connessione chiusa dall'altro endpoint */close(sockfd);/* rimuovi sockfd dalla lista di socket

che la select deve controllare */FD_CLR(sockfd, &allset); client[i] = -1; /* cancella sockfd da client */

}else

reti_writen(sockfd, buff, n);if ( --ready <= 0 )

break;}

}}

}

98PRATICA (Lez. 4)

Autunno 200374��?�=�;���6 � � ��4 � =���� ���� ;���

�; ?�� � =��!? � �/=��69?�?/� �1� � � ����� �:="��� � � ?��/6 � 6�!�. � ��# � 0 �?�69?��/=@; � ?B?�� � � =@?�� $-�>?�69? � ;%�:= � ? � ��� ;

�3 ������4 ���!49� 0 =@;�<>;$4��!;<�4� = ?���� 0 �� ��8:8��!4 � =�� �/=@?�8:6 � 6�!�. � �<>; �/=�!4� 6 ��� 0 ��4 � ?������ ; ��4 6 ���/=@<>; � 0 =�;!<>; � ;>;�4��9;<� =�?;�1� � �/;��:= � ?B?�� � � =@?��

�3 ������4 ���!4 ��!4� 6����; � 6��$? �<��� � ?B; � � 476��<� ="��? � 47=���������4 � =�����!4 � ="�*=@6

��; ?�� � =��!? � 4 ="� �����>; � ;�4 =:<$6��:6�� 0 �$=������!4 ���!4 ?�69?47=����:6�?/�:; �:=�� ;<�B;�� � 47=��<� =���? �

Page 50: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

99PRATICA (Lez. 4)

Autunno 200374��?�=�;���6 � � ��4 � =���� ���� ;���

�356 � 4�� !�!��>;�?���;�4���!���?������$=������!4 ���!49����� �>8��<� � =@4 � � ?�/6 � 6��<� =��!? �

��;>�/;�4 � � ?��/=@?�8:6 � 6��:476���� ���/6�����4 698:?�=��<� ="��? �

�; � =�� ="� �*;�4 � � ? � =�<���6 � � � � �"� �>6 ����47;<��=@69?�=��:=�3 � 5

�;>�/;�4 �%3 � 5 ?�69? �!4� 6��� =�? 8

100PRATICA (Lez. 4)

Autunno 20038����!4���="�*=

�=����<� =��!? � �/=��69?�?�� �1� �

�3 ���<� ="��? � �/=��:="����6�?�?�� �1� �

Page 51: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*0�"*��)+� �� 12�

� � ���� � �� � � �� �

PRATICA - Lezione 5

102PRATICA (Lez. 5)

Autunno 2003� 6����� � 6�� � =�69?��

�,�; � � ?��*=@6�?/�%���? � ��� ��� �<������4�� � �/; � ;%�69?B=��/6����� �

�� � � � � ?��>6�����=@69?�=��/69?�6�!:=�?�;�47=���# 69?B6 6���� $� � �

�4�� 0 ;!?�?�6 � ? � ; � 6�4 �%#�=@? � 6 ;�?�� 0 ��� � 4 � ��� � 4����:= �

�69<��4� � �����<$

Page 52: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

103PRATICA (Lez. 5)

Autunno 2003,�= ��� �"� =

��

� 5 , � � 5 A � 8% � =���� �"� 6��/6����� �

�3�3:3�+�5 % 5 �43�3 � =���� �"� 6�3�3

�3�3:3�+�5 % 5 �43�3 �

� � =���� �"� 6�3�32����4 � ; ���!4��/=@69?/� �

�3�3:3�+�5 % 5 �43 A � 3 �

� � =���� �"� 6 <��<���/;!8:8:= �:=��69? � 476 ��� 6�3�3:3�+�5 % 5 ��%+A 3 � =���� �"� 6)%+A 3

104PRATICA (Lez. 5)

Autunno 20035 ����=@69?�=

� 3 � HGD 3 ACB &A ��� ������&*��$���� ��,��3'�� ���!���� 3 � B 8�H ��� �,�� � � ���� � � �#� '���&�!�� '����! ��� ��!,�"��� 3 � B 3 0 �>D 3 � � 8 ��� ��� �!� '�'+� "��2����� � �9('�� � ����:'�"���� ���� 3 � 8+D D 3 D � ��������� �����3'���� ��'����3���#���� 3 � 4 8�8 5 A � ? . 8 ��'�������'�� � ������ � ��'���������%� '�������� �$��� 9 � 3 � � ?:0 � 8+D ��'�������'�� � �� ������ "��%"��3 ���� � ���'��������%�%� '����� 3 � D . H � � ������( ��!�%�%� �����,�"#� ����� � � ��� ������ '����� 3 � ��0IBCH � � ������( ��!�%�%�,�"#�;����� � �6�%���! �� ��� '����� 3 � D . � 3�� A � �'���� � ������� ��,�"#� � �!� � �2�3� ������ '����� 3 � ��0IB � 3�� A � �'���� � ������� ��,�"#� � �!� � � �%���! �� �� '����� 3 � D . �>? � 8 3 ��� &���'�"�� ����� � �3� ������ '����� 3 � ��0IB �I? � 8 3 ��� &���'�"�� ����� � �����! �� �� '����� 3 � D 8 � ��8�ACBCB>D ������&*��$����3� "#��� � � �%�'*� �( �� ��� ��%��� '����� �� 3 � D 8 � ��8 5+3 D � ������&*��$����3� "#��� � � �%�'2��'�� ����� '����� �� 3 � �GE 5 8 � �%��� ��'* ��!�%'���� ��� 3 � � ��8 � 353 5 H A� 4 ����� ���%'���� �� ����3'�"���� ��� ��'���� �������������$��� !? 5���� B>D ?30� � ����! ���� � ����� "��'*��'��2�! �����? 5�� 3 5 �I? 3 0 � '����%� '����!����� � ���!� ���� ? 5? 5�� � � � � � &��&1 � '�1 � � 9 �� 5�� 4 8�8 5 A � ? . 8 ����& ��'2����� � �3� ����!�%& � ���� '����� 5�� � A�ID � ����& ��'*&*����� & '2����� � �3� ���:��&�� �%�%� '����� 5�� � A� ��8 � �

� � � 7(� & "�& � ����&������ � � ���!� 5�� 0 3 B 8 � A E �� ���,�� � � � �� ��'���� ��& '2 �� 0 !��� �

Livello:

SOL_SOCKET

Livello:

IPPROTO_IP

Livello:

IPPROTO_TCP

Page 53: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

105PRATICA (Lez. 5)

Autunno 20038�� � �/6��� 6�� � �%��� � �/6 � 6�� �

� � �!� / ����� � ����� � (���.���!" &3�� �� ������ (��+. ( %�!$ � ������ � �! � ��� �� � �� ���1 � �� ( � � ����� ��� �� (��+.�/ �������� / ��� ( �� �� ����� (���. ( %�#$ � ���� � � �!�� � � ��� � �!4���1 � �� ( � � ������ ��� ��)(���.�/ � �!���/ ��� (��

� � / ( � ��� ����� �( ��� (��- �" ���������( � �$# � �� 0, ��� �� �� ��� �

����� (��+. ( %�#$ �� �� ������ *�0 � $ �� � 0 � � , � � � � � �"� ��� & �'(�� $ � �� ( (����� � ��� / 6 ( % &�� ( ����� ����.���� %�� / � � � � %!� � �� �!�������� � / ��� ( �"����� ��� ( �!��� � � ���

� ( � � � �%/ ��� �� (���.�/ ������ � � � & � ������� (��. ( %�#$ �� �� ����� *�0 � $ � � 0 � � , � ��� � � ���/ ���� � ��� & �(��

��� �( ����� / ��� � � � ���'& &��� �� ���� �������( � � ��� &�����/ ����� � � ��# � � / 6 ( % & � ( ���9:� � ������ / � ����� ( % %� �� ��� � ����� �)(9����# �� / 6 ( % & � ( ���9:������ / � �����

106PRATICA (Lez. 5)

Autunno 2003� 5 �-:'+�5 � 7�A � � %

��8 ��' � ? �:47698:47;�<>< ;%�:4��9?����>=�? =�?/� � � � � =@?��:=@47=�� �*6+�:=���<� � =@?�;��*=@6�?/�

�, � � � �!? � ���:6 � 4 �<!�!��>=@?����!4 =@4�� � ? =�?��:=@47=�� ��6��:=�!:4769; ���;�� �

�3 ���:47698:4 ;!<><$;��:6�� 4�� !�!����69? � 476 �"� ;�4��

�� �?� � 6 ���*=@69?�� �%�:=��/;�!:=�� = � ; � ;$=���!:4 69;<���;�� � ?�6�? � ="��?��� ; ��� 6+�69< � ? � � ��

� � � �!����� �( �������( / 6 ������( � �%��� * * �!�

Page 54: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

107PRATICA (Lez. 5)

Autunno 2003� 5 �-8-+ +�5 +

��

� �>=����:476���� ���/6 �>=�? � ?�;%� 0 =@;�<>; � ;>;%����� �<� � � �/= ;�����4 � ;� � �1� � 4 ; � 0 �%����4 � ;%���47= ��� � 4 ; ��47= � 6�4 ?�;��69?B=�� ��� ����4 = �1� 694���:4769? � 6 ;<�+� ������4��?� � ��� 6�

� ���/=�� � ; � �/;�?/�:6+3 � 5 8 � ="�:; � 6���;!=����!8:?�;�� = � � 3 = 3 5� ="��?��>8���?��!47; � 6

�, � =@? � ��476 47= � 6�4 ?�; � 6 �>=�� ��;�� 694����:=��/6 �4�!4 47694

108PRATICA (Lez. 5)

Autunno 2003� 5 � ��8�8�3 � , 3 � 8

�� � A �%�:=947="���:6��

� ; �9� ;��69?�?/�<���/=@69?����>;!?��6947;>; �1� =���;�

+ � % �:=947=����:6�� � ;��>� ; ��6�? ?�� ���/=�69?����!4 ; � � ; � ;%� 0 = � �/; �� ="��?��>8���?��!47; � 6*� � ��4747694��?8�A 5 (/(*+ 8 � 8&%�

('69?�� � �>47="���:6�� � ; � ���!?�8:69?�6������ �:= � = � � � � �!47=@6947=<��<���/;!8:8:=�698:?�=�� �+��� �69?��:=� � ���� "������� % (������ ( % ()" " � �� � � � " � � � �)( � � � � � � �����

��������� ���( / 6 ������( � �%� $ � 1 � 37 , $� 1 � � ������ �+� * 1 , � � ������( � ��� / / ��� ���� � � � �!����������� � �( / 6 � ��� ( � ����7 � $ ,���*���� * �

Page 55: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

109PRATICA (Lez. 5)

Autunno 2003� 5 �-, 3�( = 8-+

�� ��� �="� ="��;�=���� � ?��*=@69?�;�<���? � 6���� ��� ;%�<� 6 ��������4 �:476 � 6��6 ��� =6947="��? � ; � =9; ��� ;%��69?�?/�<���/=@6!?/�%#�% A 3 $

�4���3"��:� � � ������� � �#� � � '���'��;� " ��� ��� '�� �@� ��'��������'�� '������� �#� � � � � ������� " ��� ����&*��'*�$������� �6�����'��� ������

�� � 69?�6���� : �� ��/ (�� ����� �( ������� � ��� � ����� ���������� � /+.�������� / � %��� � � ���������! �� / ��������� ����� � ��

�� � 69?�6����

≠ : �-� �-� =�?�8���4 :� �����)( ���������� ( ����� � � ����� ����������� ���������� ����� � ���� ( � � %��� � �� �!� � ���� / $ ��1 ���+8 � � $ ������ � �+&�� � / ��� ��� ��� �������'&�� ( ������� / / �

� ( � �������� ( �!��� � 69?�6����

≠ : �-� �-� =�?�8���4 ≠ :�

* / (����� ( � ��� �( ���!��� ���� �( ������ %!� ��� / ��/ � ������� � ��� ( � � � �� � � ����&�:���������� ����� � �� ��� ������� (�� %��� � �� ��� % ( � ��������� ( �!���( / / ��� ��� /���� / ( � ��� ����� �( ��� ( %���� �+&���� ( % (

/ ��/ � ���"� � ����)( � � �������� � ��� ��� ( � (�� � �!� � / / ����

110PRATICA (Lez. 5)

Autunno 2003� 5 � +�A � :�; � � � 5 � � (>7-:<; �

�A'69? % A 3 �9� 6�����;��*=�6��:="���:69?�=�!:=�� � � � � ����� 6�� � !�!4� =��=�� ��; � 6?�� �"� ; � =�?/�<� � 47;%�:=�% A 3 � � =�?��:=9?�69? �:6 � 4 �<!�!���� � ����4��=6����!4�� � 6 �

�A'69?�; 7 3 � � ���!? � � ;�� =��:; ��� 0 � ��� =9=�? 6����!4�� � 6 � ����?�8:69?�6�;�?/������� ; � =

Page 56: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

111PRATICA (Lez. 5)

Autunno 2003� 5 � +:A � , 5 � � % � � 5 � � (979, 5 � � %

�3 �!44%+A 3 �%; 7 3 =������<� ; � � � �?&

�3 ����� � ; � � � � � : ���

112PRATICA (Lez. 5)

Autunno 2003� 5 � +:A � % 3 � 8�5 � � 5 � � (97 % 3 � 8 5

� �� �� �� ������ // ( ���� ����� � ��� � � � ��� ( � � �����/ ( ���� ��� �� ����� � � �� ����(�����)( � � ������

��

+���;�����4 �!;<��� � 4�� ��� ��4�� ��� � 4769< ��4�� ��� <��/8

��

� 47= � � � � 47= � � � � ����?���� ����?�� � 6

��

%+=@<��!6 � � �:=��/;�!:=�� = � ; � 6 ��� � =@?��:= � ; � � ?��*=�69?����/=�!4� 6 � �;

Page 57: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

113PRATICA (Lez. 5)

Autunno 2003� 5 ��%$5 3�8

��

� 5 A � � � % +48 � ��

� 5 A � �-7 = + � �

114PRATICA (Lez. 5)

Autunno 20035 ���*=�69?�=��:=�3�3 � �

��

� � ����� �1� ; � ;�����4 � ? 47; � �/6 � �� � �:=�3�3 ; ��� 694 ;� � ;����4� ="��;��*=�69?������ �����6�� � 4 � =�4 �$;!?�� 0 �?� � 3�3 0 �!;<���94 � 0 �?�6947<>; � <��!? � � �����47= ��� 6+�:; �����47?�� �

��

3 �!4 <%� �1� ���:=9=�?/���!47=@4��?� �>6����*=�69?�=���� �"� � 3*3 0 ��;�����4

��

3 �!4 <%� �1� ���:=������<��="� ="�;!4��>=�� % =�<�� % 6 ,�= ����#�=�? 0 6�����$ ������:; � ;�8:4 ;�<

�3 ����� � ; � � � � � �

Page 58: PRATICA -Lezione 1 · PRATICA (Lez. 2) Autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1] 21130 prompt > netstat – a Proto Recv-Q Send-Q Local address Foreign address (state)

115PRATICA (Lez. 5)

Autunno 20035 ���*=@69?�=��:=�% A 3

�%+A 3 � ��8�8�3 � , 3 � 8�

, ���� �������� �� (+� � � � � � / � � ( � ��� � ��������� �� � �������� � 0 � � , � ��� � �

�%+A 3 �-� � � + %

� �"� ��� �� ���� �� � � %���� ��� %�� �� #� �� ��� /��"� � � / � � � � ���� ��� � � #� � � �� ��� ������ %!� �$� ���� ( � � � %"��� ���� � � �"����� � ( ����� � / �

� ( � �������� ( �!�

�%+A 3 �-� � � � 8 =�

, ���� �������� �� (+� � � � � � � ��� /�����/ ( � ���"� / / 6 1 �"�9��� / / � � ( � �������� ( ����

%+A 3 � ( 5 7-8�, � 5� 3 � ����� / � �� / 6 � / � ( ��� ( � ��� ��� / ���+&���� � �� �� "� � � �������� � � %��� � ��� �

� ��� ( � � � ( ������� � ( ���

116PRATICA (Lez. 5)

Autunno 20038 ���!<��:=@6��:=���� � �>8�� � �/6��� 6�� �

#include "basic.h" #include <netinet/tcp.h> int main(int argc, char **argv) {

int sockfd, mss, sendbuff, ttl;socklen_t optlen;

if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 )err_sys("socket error" );

optlen = sizeof(ttl);if( getsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, &optlen) == -1 )

err_ret("getsockopt error" );printf("getsockopt: TTL = %d\n" , ttl);

ttl = ttl + 16;

if( setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) == -1 )err_ret("getsockopt error" );

printf("TTL modificato\n" , ttl);if( getsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, &optlen) == -1 )

err_ret("getsockopt error" );printf("getsockopt: TTL = %d\n" , ttl);exit(0);

}

sockopts-set.c