Salve ragazzi, come da titolo sto cercando di creare una semplice applicazione client-server in linux.
Praticamente non voglio far altro che inserire da tastiera una stringa nel client e farla rappresentare nel server.
Una cosa banalissima ma non so perchè non funge.
Vi riporto i due codici, grazias
SERVER
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <time.h>
#include "wrapper.h"
#define PORT 1024
int main(int argc, char** argv) {
system("clear");
char lista_op[40] = {"1: Login \n2:Uscita"};
char log_id[30];
int listenfd, connfd,fin=1,scelta=0;
struct sockaddr_in servaddr, utente, add_fd;
socklen_t len;
pid_t pid;
//creazione socket
listenfd = Socket(AF_INET, SOCK_STREAM, 0);
//indirizzo server
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
//numero di porta del server
servaddr.sin_port = htons(PORT);
//assegnazione indirizzo
Bind(listenfd, (struct sockaddr *) &servaddr, sizeof (servaddr));
//in ascolto
Listen(listenfd, 1030);
printf("In attesa di connessioni...\n");
while(1) {
len = sizeof(utente);
//accetta nuova connessione
connfd = Accept(listenfd, (struct sockaddr *) &utente, &len);
//crea fork
if(Fork(pid) == 0) { //figlio
close(listenfd);
printf("\nAccettata la connessione con il client : %s\n\n", inet_ntoa(utente.sin_addr));
//cliente connesso
while(fin != 0)
{
system("clear");
//invia la lista delle operazioni al client
write(connfd, lista_op, 40);
//leggo scelta del cliente
read(connfd, &scelta, sizeof(scelta));
printf("\nCliente: %d\n\n",scelta);
switch (scelta) {
case 1:
system("clear");
printf("LOGIN\n");
//legge l'identificativo
read(connfd, log_id, sizeof(log_id));
printf("Identificativo inserito : %s",log_id);
break;
case 2:
system("clear");
printf("\nCliente disconnesso\n");
close(connfd);
exit(1);
break;
default:break;
}
close(connfd);
exit(0);
//fine fork figlio
}
}else { //padre
close(connfd); //fine fork padre
}
}
}
CLIENT
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <string.h>
#include <sys/types.h>
#include "wrapper.h"
#define PORT 1024
int main(int argc, char** argv)
{
int sock,scelta,fin=1,ide=1;
char buffer[40],logid[30], risp_log[40];
struct sockaddr_in servaddr;
sock=Socket(AF_INET, SOCK_STREAM, 0);
servaddr.sin_port = htons(PORT);
servaddr.sin_family = AF_INET;
servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
Connect(sock, (struct sockaddr*) &servaddr, sizeof (servaddr));
//invio identificativo al server
write(sock,&ide,sizeof(ide));
while (fin != 0) {
//la funzione memset (void *memset(void*str,int c,size_t n) copia il carattere c ai primi n caratteri della stringa puntata
//dall'argomento str
memset(buffer, 0, strlen(buffer));
printf("\n\n **BENVENUTO**\n\n");
//ricevo la lista delle operazioni dal server
read(sock,buffer,40);
printf("\n%s\n",buffer);
printf("inserire scelta");
scanf("/%d",&scelta);
while ((scelta < 1) || (scelta > 2 )) {
printf("scelta non valida, riprovare");
scanf("%d",&scelta);
}
//invio scelta al server
write(sock, &scelta, sizeof(scelta));
switch (scelta) {
case 1 :
system("clear");
printf("\nLOGIN");
printf("\nInserire identificativo (MAX 30 caratteri) : ");
scanf("%s",logid);
//invio logid al server
write(sock, &logid, sizeof(logid));
//leggo la risposta dal server
read(sock, risp_log, 40);
printf("\n%s", risp_log);
break;
case 2 :
printf("USCITA...");
close(sock);
exit(0);
break;
default:break;
}
}
close(sock);
exit(0);
}