Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 5

1. Descriu el funcionament del codi de la funció handle d'aquest enllaç.

Recorda indicar
quines variables representen la connexió al Destination Server i al Client, com es du a terme
la gestió de les connexions, i destacar cada un dels motius associats a cada un dels valors
de retorn de la funció.

Primer es declaren les variables, a continuació es crea un socket de tipus conexió, si hi ha


un error, retornarà -1.
Es fa el connect, on es passa el socket, l'estructura que es de tipus remoteaddr, però fem
com si fos sockaddr, i el tamany de l'adreça. Si el vaor retornat en el connect és més petit a
'0', es tanca el socket, ja que no s'ha pogut establir la conexió, i retorna un -2.

Seguidament es declara el maxsock, aquest es l'ultim que entra, és a dir, el màxim que
podem tenir.

Dins el while, primer 'netajem'/posem a cero el contenidor de fds. Amb el _SET introduim els
dos fd a readsocks

Establim readsocks per tal que siguin d'escriptura i de l'ectura, amb tots els events d'entrada
que volem que el nostre sistema es desperti. S'agafa el màxim +1 , declarat anteriorment.
Si aquest select resulta erroni, retornarà un -1 i tancarà els sockets.

Despres mirem si remote_sock està dins de readsocks actiu, i actualitzem les dades del
server, es realitzara el echo:
-Es declara nbytes a les dades rebudes pel remote_socket, del buffer.
*si els bytes rebuts son '0', és a dir, res. el server realitzara el tancament actiu (FYN..).
Tancant els sockets i retornarà 1.
*si els bytes són negatius es seguirà endavant, sortirà del if.
*si no, s'enviaràn els bytes en el newsock (client) pel buffer.

A continuació mirem si newsock està dins de readsocks actiu, i actualitzem les dades del
client, es realitzara el echo:
-Es declara nbytes a les dades rebudes pel newsock, del buffer.
*si els bytes rebuts son '0', és a dir, res. el server realitzara el tancament actiu (FYN..).
Tancant els sockets i retornarà 2.
*si els bytes són negatius es seguirà endavant, sortirà del if.
*si no, s'enviaràn els bytes en el remote_sock (server) pel buffer.

2. Descriu el funcionament del codi de la funció handle d'aquest enllaç. Recorda indicar
quines variables representen la connexió al Destination Server i al Client, com es du a terme
la gestió de les connexions, i destacar cada un dels motius associats a cada un dels valors
de retorn de la funció. Explica com es veurien afectats el client i el Destination Server en fer
servir aquesta solució en lloc de l'anterior.
Primer es declaren les variables, a continuació es crea un socket de tipus conexió, si hi ha
un error, retornarà -1 i es tancarà el socket.
Es fa el connect, on es passa el socket, l'estructura que es de tipus remoteaddr, però fem
com si fos sockaddr, i el tamany de l'adreça. Si el vaor retornat en el connect és més petit a
'0', es tanquen els sockets, ja que no s'ha pogut establir la conexió, i retorna un -2.

Seguidament es declara el maxsock, aquest es l'ultim que entra, és a dir, el màxim que
podem tenir.

Dins el while, primer 'netajem'/posem a cero el contenidor de fds. Amb el _SET introduim els
dos fd a readsocks i es declaren dues variables.

Establim readsocks per tal que siguin d'escriptura i de l'ectura, amb tots els events d'entrada
que volem que el nostre sistema es desperti. S'agafa el màxim +1 , declarat anteriorment i
es posa un timeval, és a dir, passat el temps tv ( 30 segons) el select retornarà un '0'. Si
aquest select resulta erroni, retornarà un -3 i tancarà els sockets.

Despres mirem si remote_sock està dins de readsocks actiu, i actualitzem les dades del
server, es realitzarà el echo:
-Es declara nbytes a les dades rebudes pel remote_socket, del buffer.
*si els bytes rebuts son '0', és a dir, res. el server realitzara el tancament actiu (FYN..) amb
el proxy. Tancant els sockets i retornarà 1.
*si els bytes són negatius es seguirà endavant, sortirà del if.
*si no, s'enviaràn els bytes en el newsock (client) pel buffer.

A continuació mirem si newsock està dins de readsocks actiu, i actualitzem les dades del
client, es realitzara el echo:
-Es declara nbytes a les dades rebudes pel newsock, del buffer.
*si els bytes rebuts son '0', és a dir, res. El client realitzara el tancament actiu (FYN..) amb el
proxy. Tancant els sockets i retornarà 2.
*si els bytes són negatius es seguirà endavant, sortirà del if.
*si no, s'enviaràn els bytes en el remote_sock (server) pel buffer.

3.

Primer es declaren les variables, a continuació es crea un socket de tipus text (UDP), si hi
ha un error, retornarà -1 i es tancarà el socket.
Es fa el connect, on es passa el socket, l'estructura que es de tipus remoteaddr, però fem
com si fos sockaddr, i el tamany de l'adreça. Si el vaor retornat en el connect és més petit a
'0', es tanquen els sockets, ja que, no s'ha pogut establir la conexió, i retorna un -2.

Seguidament es declara el maxsock, aquest es l'ultim que entra, és a dir, el màxim que
podem tenir.

Dins el while, primer 'netajem'/posem a cero el contenidor de fds. Amb el _SET introduim els
dos fd a readsocks i es declaren dues variables.
Establim readsocks per tal que siguin d'escriptura i de l'ectura, amb tots els events d'entrada
que volem que el nostre sistema es desperti. S'agafa el màxim +1 , declarat anteriorment. Si
aquest select resulta erroni, retornarà un -3 i tancaran els sockets.

Despres mirem si remote_sock està dins de readsocks actiu, i actualitzem les dades del
server, es realitzarà el echo:
-Es declara nbytes a les dades rebudes pel remote_socket, del buffer.

*si els bytes són negatius es seguirà endavant, sortirà del if.
*si no, s'enviaràn els bytes en el newsock (client) pel buffer.

A continuació mirem si newsock està dins de readsocks actiu, i actualitzem les dades del
client, es realitzara el echo:
-Es declara nbytes a les dades rebudes pel newsock, del buffer.
*si els bytes rebuts son '0', és a dir, res. El client realitzara el tancament actiu (FYN..) amb el
proxy. Tancant els sockets i retornarà 2.
*si els bytes són negatius es seguirà endavant, sortirà del if.
*si no, s'enviaràn els bytes en el remote_sock (server) pel buffer.

El client és qui realitza el tancament actiu amb el proxy, és a dir, primer s'enviarà la
data/hora ( en el cas del daytime) al proxy i desprès es tancarà.
En el cas del echo, igual.

1 /* Arguments:
2 argv[0] = program name
3 argv[1] = destination server IP address in dot-decimal char "xxx.xxx.xxx.xxx"
4 argv[2] = destination server service port as char "xx"
5 argv[3] = listen port of TCP Proxy server as char "yy"
6 argc has to have a value of 4
7 */
8 int main (int argc, char **argv)
9{
10 int sock;
11 struct sockaddr_in servaddr;
12 struct sigaction sa;
13 int reuseaddr = 1; /* True */
14
15 /* check command line args */
16 if(argc<4) {
17 printf("usage : %s destination-server detination-port listen-port\n", argv[0]);
18 return 1;
19 }
20
21 /* Fill the global variable remoteaddr with
22 the destination-server address and port */
23 remoteaddr.sin_family = AF_INET;
24 inet_aton(argv[1],&remoteaddr.sin_addr);
25 remoteaddr.sin_port=htons(atoi(argv[2]));
26
27 /* Create the socket */
28 sock = socket(AF_INET,SOCK_STREAM,0);
29 if (sock == -1) {
30 perror("socket");
31 return 1;
32 }
33
34 /* Enable the socket to reuse the address */
35 if (setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, sizeof(int)) == -
1) {
36 perror("setsockopt");
37 return 1;
38 }
39
40 /* Fill the server address */
41 servaddr.sin_family = AF_INET;
42 servaddr.sin_addr.s_addr=htonl(INADDR_ANY);
43 servaddr.sin_port=htons(atoi(argv[3]));
44
45 /* Bind to the address */
46 if (bind(sock, (struct sockaddr *)&servaddr, sizeof(servaddr)) == -1) {
47 perror("bind");
48 return 1;
49 }
50
51 /* Listen */
52 if (listen(sock, BACKLOG) == -1) {
53 perror("listen");
54 return 1;
55 }
56
57 /* Set up the signal handler */
58 sa.sa_handler = wait_for_child;
59 sigemptyset(&sa.sa_mask);
60 sa.sa_flags = SA_RESTART;
61 if (sigaction(SIGCHLD, &sa, NULL) == -1) {
62 perror("sigaction");
63 return 1;
64 }
65
66 /* Main loop */
67 while (1) {
68 struct sockaddr_in their_addr;
69 socklen_t size = sizeof(struct sockaddr_in);
70 int newsock = accept(sock, (struct sockaddr*)&their_addr, &size);
71 int pid;
72
73 if (newsock == -1) {
74 perror("accept");
75 return 0;
76 }
77
78 printf("Got a connection from %s on port %d\n", inet_ntoa(their_addr.sin_addr),
htons(their_addr.sin_port));
79
80 pid = fork();
81 if (pid == 0) {
82 /* In child process */
83 close(sock);
84 printf("handles returns with %d\n", handle(newsock));
85 return 0;
86 }
87 else {
88 /* Parent process */
89 if (pid == -1) {
90 perror("fork");
91 return 1;
92 }
93 else {
94 close(newsock);
95 }
96 }
97 }
98
99 close(sock);
100
101 return 0;
102 }

You might also like