Creato alcuni esercizi su server ricorsivi. bugfixes

This commit is contained in:
2014-04-16 14:24:42 +02:00
parent 6c7976408f
commit e03539a322
31 changed files with 201 additions and 16 deletions

View File

@@ -1,4 +1,3 @@
/* Client che interroga un daytime server */
#include "../basic.h" #include "../basic.h"

View File

@@ -1,4 +1,3 @@
/* Implementa un daytime server che risponde alla porta definita dall'utente */
#include "../basic.h" #include "../basic.h"
#include <time.h> #include <time.h>

View File

@@ -1,2 +1,2 @@
il server per ogni richiesta accettata copia la data locale al socket client il server per ogni richiesta accettata copia la data locale al socket client
il client colelgato legge la data copiata e stampa il client collegato legge la data copiata e stampa

View File

@@ -1,4 +1,4 @@
/* Client che si collega a un server e basta */
#include "../basic.h" #include "../basic.h"
@@ -28,11 +28,14 @@ int main(int argc, char **argv) {
} }
struct sockaddr_in r_server_local_addr; struct sockaddr_in r_server_local_addr;
int r_server_local_addr_len = sizeof(r_server_local_addr); unsigned int r_server_local_addr_len = sizeof(r_server_local_addr);
char * socket_buffer = (char *) malloc (r_server_local_addr_len) ; char * socket_buffer = (char *) malloc (r_server_local_addr_len) ;
int ridden;
read (sockfd, socket_buffer,r_server_local_addr_len ); ridden = read (sockfd, socket_buffer,r_server_local_addr_len );
fprintf(stdout,"Ho letto la prima volta %d\n bytes",ridden);
ridden = read (sockfd, socket_buffer,r_server_local_addr_len );
fprintf(stdout,"Ho letto la seconda volta %d\n bytes",ridden);
memcpy (&r_server_local_addr,socket_buffer, r_server_local_addr_len); memcpy (&r_server_local_addr,socket_buffer, r_server_local_addr_len);
@@ -43,7 +46,7 @@ int main(int argc, char **argv) {
inet_ntop(AF_INET, &(r_server_local_addr.sin_addr), buff, INET_ADDRSTRLEN);// get ip inet_ntop(AF_INET, &(r_server_local_addr.sin_addr), buff, INET_ADDRSTRLEN);// get ip
port = ntohs(r_server_local_addr.sin_port);// get port port = ntohs(r_server_local_addr.sin_port);// get port
fprintf (stdout,"%s%c%hi\n",buff,':',port); fprintf (stdout,"%s%c%hu\n",buff,':',port);
exit(0); exit(0);

View File

@@ -1,4 +1,4 @@
/* stampa l'ip del client che si collega */
#include "../basic.h" #include "../basic.h"
#include <time.h> #include <time.h>
@@ -31,10 +31,10 @@ int main(int argc, char **argv) {
} }
struct sockaddr_in client_addr; struct sockaddr_in client_addr;
int client_addr_len = sizeof(client_addr); unsigned int client_addr_len = sizeof(client_addr);
struct sockaddr_in server_local_addr; struct sockaddr_in server_local_addr;
int server_local_addr_len = sizeof(server_local_addr); unsigned int server_local_addr_len = sizeof(server_local_addr);
char * socket_buffer = (char *) malloc (server_local_addr_len) ; char * socket_buffer = (char *) malloc (server_local_addr_len) ;
@@ -49,7 +49,7 @@ int main(int argc, char **argv) {
inet_ntop(AF_INET, &(client_addr.sin_addr), buff, INET_ADDRSTRLEN);// get client ip inet_ntop(AF_INET, &(client_addr.sin_addr), buff, INET_ADDRSTRLEN);// get client ip
port = ntohs(client_addr.sin_port);// get client port port = ntohs(client_addr.sin_port);// get client port
fprintf (stdout,"%s%c%hi\n",buff,':',port); fprintf (stdout,"%s%c%hu\n",buff,':',port);

View File

@@ -1,2 +1,2 @@
il server attende una connessione dal client e stampa lip del client il server attende una connessione dal client e stampa ip e porta del client
il client si connette soltanto al server il client si connette al server e stampa ip e porta del server

View File

@@ -1,4 +1,3 @@
/* Client che si collega a un server e basta */
#include "../basic.h" #include "../basic.h"

View File

@@ -1,4 +1,3 @@
/* stampa l'ip del client che si collega */
#include "../basic.h" #include "../basic.h"
#include <time.h> #include <time.h>

BIN
7.client-server_recursive/client Executable file

Binary file not shown.

View File

@@ -0,0 +1,28 @@
#include "../basic.h"
int main(int argc, char **argv) {
int sockfd;
struct sockaddr_in servaddr;
if (argc != 3){
printf("usage: daytimecli <indirizzoIP> <porta> \n");
exit(0);
}
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
printf("socket error\n");
exit(0);
}
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2])); /* server port */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s\n", argv[1]);
exit(0);
}
if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
printf("connect error\n");
exit(0);
}
exit(0);
}

View File

@@ -0,0 +1,31 @@
/* Client che interroga un daytime server */
#include "../basic.h"
int main(int argc, char **argv) {
int sockfd, n;
char recvline[MAXLINE + 1];
struct sockaddr_in servaddr;
if (argc != 3){
printf("usage: daytimecli <indirizzoIP> <porta> \n");
exit(0);
}
if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0 ){
printf("socket error\n");
exit(0);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(atoi(argv[2])); /* server port */
if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
printf("inet_pton error for %s\n", argv[1]);
exit(0);
}
if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0){
printf("connect error\n");
exit(0);
}
exit(0);
}

Binary file not shown.

View File

@@ -0,0 +1,66 @@
#include "../basic.h"
#include <time.h>
int main(int argc, char **argv) {
int listenfd, connfd, n;
struct sockaddr_in servaddr;
char buff[INET_ADDRSTRLEN];
short port;
if (argc != 2 ){
printf("usage: daytimesrv <porta>\n");
exit(0);
}
if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("socket error\n");
exit(0);
}
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* wildcard address */
servaddr.sin_port = htons(atoi(argv[1])); /* server port */
if( (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0){
printf("bind error\n"); exit(0);
}
if( listen(listenfd, 5) < 0 )
{ printf("listen error\n");
exit(0);
}
struct sockaddr_in client_addr;
unsigned int client_addr_len = sizeof(client_addr);
for ( ; ; ) {
if( (connfd = accept(listenfd, (struct sockaddr *) &client_addr, &client_addr_len)) < 0)
{ printf("accept error\n");
exit(0);
}
int split = fork();
if ( split < 0) {
printf("fork for iterative server failed\n");
exit(-1);
}
if (split == 0){
close(listenfd);
inet_ntop(AF_INET, &(client_addr.sin_addr), buff, INET_ADDRSTRLEN); // get client address
port = ntohs(client_addr.sin_port);// get client port
fprintf (stdout,"%s%c%hu\n",buff,':',port);
exit(0);
} else {
printf("connection managed by a child process\n");
close(connfd);
}
}
}

View File

@@ -0,0 +1,41 @@
/* stampa l'ip del client */
#include "../basic.h"
#include <time.h>
int main(int argc, char **argv) {
int listenfd, connfd, n;
struct sockaddr_in servaddr;
char buff[MAXLINE];
time_t ticks;
if (argc != 2 ){
printf("usage: daytimesrv <porta>\n");
exit(0);
}
if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
printf("socket error\n");
exit(0);
}
bzero(&servaddr, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY); /* wildcard address */
servaddr.sin_port = htons(atoi(argv[1])); /* server port */
if( (bind(listenfd, (struct sockaddr *) &servaddr, sizeof(servaddr))) < 0){
printf("bind error\n"); exit(0);
}
if( listen(listenfd, 5) < 0 )
{ printf("listen error\n");
exit(0);
}
for ( ; ; ) {
if( (connfd = accept(listenfd, (struct sockaddr *) NULL, NULL)) < 0)
{ printf("accept error\n"); exit(0);} else {
}
n=read(connfd, buff, MAXLINE);
fprintf (stdout,%s\n,buff);
close(connfd);
}
}

Binary file not shown.

View File

@@ -0,0 +1,9 @@
all : server client
server : daytimesrv.o ../fun-corso-reti.o
gcc -o server daytimesrv.o ../fun-corso-reti.o
client : daytimecli.o ../fun-corso-reti.o
gcc -o client daytimecli.o ../fun-corso-reti.o
daytimesrv.o : daytimesrv.c ../basic.h
gcc -c -o daytimesrv.o daytimesrv.c
fun-corso-reti.o : ../fun-corso-reti.c ../basic.h
gcc -c -o ../fun-corso-reti.o ../fun-corso-reti.c

View File

@@ -0,0 +1,8 @@
server : daytimesrv.o ../fun-corso-reti.o
gcc -o server daytimesrv.o ../fun-corso-reti.o
client : daytimecli.o ../fun-corso-reti.o
gcc -o client daytimecli.o ../fun-corso-reti.o
daytimesrv.o : daytimesrv.c ../basic.h
gcc -c -o daytimesrv.o daytimesrv.c
fun-corso-reti.o : ../fun-corso-reti.c ../basic.h
gcc -c -o ../fun-corso-reti.o ../fun-corso-reti.c

View File

@@ -0,0 +1,3 @@
il server attende una connessione dal client e stampa lip del client
il server non blocca poiché e attivo in modo ricorsivo
il client si connette soltanto al server

View File

BIN
7.client-server_recursive/server Executable file

Binary file not shown.