[C - WIN] Applicazione Client-Server

peppesheva

Utente Attivo
77
2
Ciao tutti, sono nuovo del forum ed è da poco che mi sono interessato alla programmazione in C in ambiente Windows. Girovagando in rete mi sono trovato a che fare con delle slide che proponevano alcuni esercizi sui socket e quindi sulla comunicazione client-server. Delle 5 tracce mi sono gia fermato alla 2° che è questa:



Scrivere un'applicazione client-server per raccogliere le iscrizioni per una gara: ogni client invia il nome del concorrente e riceve dal server il numero di pettorale (progressivo) assegnato a quel concorrente.
Il server, inoltre, salva su un file tutti i nomi e i relativi numeri. L'elenco degli iscritti può anche essere richiesto da qualsiasi client.




Questi invece sono i codici, client e server, che ho usato per svolgere il primo esercizio proposto!

Codice:
//SERVER

#include <stdio.h> 
#include <winsock.h> 
#include <string.h> 
#include <stdlib.h>

#define MSGSIZE 80

int main(int argc, char *argv[]) 
{ 
SOCKET listenSocket; 
SOCKET AcceptSocket;
SOCKADDR_IN Server_addr; //pre assegnare una porta ed un indirizzo IP alla socket si crea questa variabile strutturata
SOCKADDR_IN Client_addr; 
int sin_size; 
short port; 
char messaggi[MSGSIZE];

int wsastartup; 
int ls_result; 

struct utenti{ 
    int eta; 
    char nome[10]; 
} utente;

/* Inizializzazione della libreria Socket */ 
WORD wVersionRequested = MAKEWORD(2,2); 
WSADATA wsaData; 
wsastartup = WSAStartup(wVersionRequested, &wsaData); 

if (wsastartup != NO_ERROR) 
    printf("Errore WSAStartup()\n"); 

/* Creazione della Socket che si porrà in ascolto di richieste del Client*/ 
listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

if (listenSocket < 0) 
    printf("Server: errore nella creazione della socket.\n"); 
else 
    printf("La Listening Socket e' partita\n"); 

/* Effettua la bind sull’indirizzo e porta ora specificati */ 
port = 4000; 

Server_addr.sin_family = AF_INET; 
Server_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
Server_addr.sin_port = htons(port); 

//bind associa un nome alla socket creata in precedenza
if (bind(listenSocket,(SOCKADDR*)&Server_addr,sizeof(struct sockaddr_in)) < 0) //descrittore di socket,indirizzo da assegnare alla socket,lunghezza in byte di Server_addr
    printf("Server: errore durante la bind.\n"); 

//getsockname(l_s,&sock_addr,&size);/*pone in sock_addr.sin_port il numero di port che bind ha assegnato ad l_s.*/

/* La socket si pone in "ascolto" tramite la listen() */ 
ls_result = listen(listenSocket, SOMAXCONN); //Descrittore socket, massima lunghezza della coda di connessioni entranti (la funzione restituisce 0 in caso di insuccesso)

if (ls_result < 0) 
    printf("Server: errore durante la listen.\n"); 
else 
    printf("La Socket e' in Ascolto\n"); 

/* La socket accetta la richiesta di connessione del Client */ 
sin_size = sizeof(struct sockaddr_in); 
AcceptSocket = accept(listenSocket, (struct sockaddr *)&Client_addr, &sin_size); 

printf("Accettata Connessione con Client: %s\n", inet_ntoa(Client_addr.sin_addr)); 

//invia un messaggio al client per confermare la sua connessione
sprintf(messaggi,"Sei Connesso: Pronto a ricevere informazioni\0");
send(AcceptSocket,messaggi,MSGSIZE,0);


/* Il Server accetta il messaggio dal Client */
//riceve le informazioni di un utente in una struct "utente"
recv(AcceptSocket, (char *)&utente, sizeof(struct utenti),0);

printf("\nNome ricevuto: %s",utente.nome);
printf("\nEta' ricevuta: %d",utente.eta);


printf("\nChiudo il Server"); 
close(AcceptSocket); 
WSACleanup(); 

printf("\n\n");

system("pause"); 
return 0; 
}
Codice:
//CLIENT

#include <stdio.h> 
#include <winsock.h> 
#include <string.h> 

#define MSGSIZE 80

int main() 
{ 
SOCKET clientsocket; 
SOCKADDR_IN clientService; 

char messaggi[MSGSIZE];
short port; 

struct utenti{ 
    int eta; 
    char nome[10];
} utente;

WORD wVersionRequested = MAKEWORD(2,2); 
WSADATA wsaData; 
WSAStartup(wVersionRequested, &wsaData); 

clientsocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 

port = 4000; 

//La struttura SOCKADDR_IN (clientService) specifica l'indirizzo famiglia, l'indirizzo ip e la porto del server con cui connettersi

clientService.sin_family = AF_INET; 
clientService.sin_addr.s_addr = inet_addr("127.0.0.1"); 
clientService.sin_port = htons(port); 

//Connect to server
if (connect(clientsocket, (SOCKADDR*)&clientService, sizeof(clientService)) < 0) {
    printf("Errore nella connessione con il Server");
    exit(1);
}

recv(clientsocket, messaggi, MSGSIZE,0);

puts(messaggi);

fflush(stdin);

printf("Nome: ");
scanf("%s",utente.nome);


printf("\nEta': ");
scanf("%d",&utente.eta);


send(clientsocket, (char *) &utente, sizeof(struct utenti),0);


//printf("Messaggio da Inviare: "); 
//gets(messaggio); 
//send(clientsocket,messaggio,sizeof(messaggio),0); //descrittore di una socket connessa, puntatore al buffer contenente i dati da trasmettere, lunghezza dei dati nel buffer, indicatore che specifica il modo in cui la chiamata è fatta

WSACleanup(); 
system("pause"); 
return 0; 
}

Non so proprio da dove iniziare :help: Le maggiori difficoltà le incontro per risolvere la prima parte! La seconda parte, cioè quella che riguarda il salvataggio nei file, non mi crea grosse difficoltà. Qualcuno potrebbe darmi una (grossa) mano per la prima parte??? Grazie mille...
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili