pratica -lezione 1 · pratica (lez. 2) autunno 2003 8 35 0 6 4!4 prompt > echoserver & [1]...
Post on 13-Jul-2020
0 Views
Preview:
TRANSCRIPT
����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*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);}
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
>
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=�? � ��$
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���� = �
PRATICA (Lez. 1)
Autunno 20039
,�=�!:4��!4 =�;%�694��/6 4�� � =
�
��
4�� � = �
��
4�� � = � 4���;��:?� ������������������� ����������������
�4�� � = � � 47= � ��?� ������� ������������� ����������������
�4�� � = � 4���;��4� =�?��� ���������� ��!����� �"�
�
����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*0�"*��)+� �� 12�
� �� � � � �
PRATICA - Lezione 2
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
$ � %�� � ��� �!���� �'& � ( ����� �� "�����)( ������� � � ( ��� $+*-,
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 ���� �
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
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 � :
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
� � � ������ ��� ���� ���������� � ���
����� ��� ���� ����� ����# � � �� � �
��� ��� ��� ����������� � �������# � � � �� �� �� � ��� � ���� � ��� � ���
��� ��� ��� ����������� � ���� � ����# � � �� �� �� �� � � � ����� ��� ���
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
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
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 */
}
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
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 ���
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);}
}
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);
}}
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
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 ; � � � �<' $
�
�
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 =@;�<>; � ; � ;!= � �:=��
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 =@;�<>;%��� = � $
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
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*,
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
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 ? � � �
�
����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*0�"*��)+� �� 12�
� �� � � � �
PRATICA - Lezione 3
52PRATICA (Lez. 3)
Autunno 2003; 7 3
��
%+4 ;����:694 � 6 6947="��? � ; � 6 ; ��� ; ��6�?�?��<���/=@69?�� ��;���� =��:;�!:= � �
��
� ��?��*; �69?�?/�<���/=@69?���� =�?:;<� � =��:;�!:=�� �
�
��7/( �
�( � �
�� ( � 3
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�����'*�%����� �$���� � � �� / � ��� / �� / � ��� �� %!� � �� ��� ����� � ��� � � %�
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
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 ,
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
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 � ����( � �%� ��� � ��, , , -* $ ���� ( � : ��
%���( � / �� ��
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 � � ;
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);
}
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>
����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*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
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
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”
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)
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'�� � '� ��"��('*������"� �' �����&�� ���� �
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 ������( � �
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
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
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
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
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
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
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
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 */}
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=��<� =���? �
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� �
����� ������� �������������� ������������ �!� �����"# �������$�&%'� (�� "*)+�,� �.-/�*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� � �����<$
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
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 ������( � �%��� * * �!�
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 � $ ,���*���� * �
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�;�?/������� ; � =
�
�
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 � �;
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 ����� � ; � � � � � �
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
top related