Ho un problema nella comunicazione tra server e client mediante le socket, praticamente quando avvio il server resta in attesa di connessione e sembrerebbe che non ci siano problemi, infatti stampa l' indirizzo del client, perņ poi non c' č scambio di dati e tutto va in loop, non capisco cosa non vada, riporto i codici del server e del client:
Server:
Client:codice:#include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <sys/socket.h> #include <arpa/inet.h> #include <errno.h> #include <unistd.h> #define LOCIP "127.0.0.1" #define BUFFSIZE 1024 #define PORT 2000 #define CONNECTIONS 512 void main(int argc, char * arv[]) { int servId, clientId, retcode; //ID Server, Client, contatore byte struct sockaddr_in servip, clientip; //Strutture per indirizzo ip server e client socklen_t servipL, clientipL; //lunghezza indirizzi char *buffer[BUFFSIZE]; char * msg[BUFFSIZE]; if((servId=socket(PF_INET, SOCK_STREAM, 0))==-1){ //apertura socket server perror("Error...creating socket..."); exit(-1); } servip.sin_family=AF_INET; //settaggio dominio e porta server servip.sin_port=htons((unsigned)PORT); inet_aton(LOCIP, &servip.sin_addr); //assegnazione indirizzo intero alla struttura mediante conversione servipL=clientipL=sizeof(struct sockaddr_in); //memorizzazione lunghezza indirizzo if ( bind(servId, (struct sockaddr *) &servip, servipL) == -1 ) //assegnazione indirizzo server per la rete {perror("trying to bind"); exit(-2);} listen(servId, CONNECTIONS); //attesa di connessioni... printf("My address/port: %s", inet_ntoa(servip.sin_addr)); printf(":%d\n", ntohs(servip.sin_port)); while((clientId=accept(servId, (struct sockaddr *) &clientip, &clientipL)!=-1)){ //accetazione connesioni da parte di client printf("Client from %s/%d connected\n", inet_ntoa(clientip.sin_addr), ntohs(clientip.sin_port)); //stampa indirizzo e porta del client while((retcode=read(clientId, &buffer, BUFFSIZE))>0){ //ricevo byte e stampo buffer[retcode-1]='\0'; printf("Client asks: %s", buffer); buffer[retcode-1]='\n'; } close(clientId); //chiudo connessione con il client printf("%s", "Connection with client closed"); } exit(0); }
codice:#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #define BUFFSIZE 1024 int main(int argc, char * argv[]) { char buffer[BUFFSIZE]; //un solo buffer per il client struct sockaddr_in serverIp; int clientId, retcode; u_int16_t fport; printf("prova"); if((clientId=socket(AF_INET, SOCK_STREAM, 0))==-1){ perror("Error creating socket"); exit(-1); } if(argc<2 || argc<3){ perror("Insert address or port number"); //il secondo parametro indicherą l' indirizzo socket del client exit(-2); } fport=htons((u_int16_t)atoi(argv[2])); inet_aton(argv[1], &serverIp.sin_addr); serverIp.sin_family=AF_INET; serverIp.sin_port=fport; //mkaddr(&serverIp, argv[1], fport); //inseirmento indirizzo del server a cui connettersi // if (connect(clientId, (struct sockaddr *) &serverIp, sizeof(serverIp)) // == -1 ) if(connect(clientId, (struct sockaddr *) &serverIp, sizeof(serverIp))==-1){ perror("Error trying to connect"); exit(-3); } if(argc<4){ perror("You have to insert a message!!!"); exit(-4); } sprintf(buffer, "%s\n", argv[3]); //il buffer conterrą il messaggio if (write(clientId, buffer, strlen(buffer))==-1) { perror("Error sending message"); exit(-5); } while((retcode=read(clientId, buffer, BUFFSIZE-1))>0){ printf("\n Read byte\n %d", retcode); buffer[retcode]='\0'; printf("Server send message \n %s", buffer); } printf("Client exiting....server closed the connection"); close(clientId); exit(0); }
Ecco rispettivamente cosa succede nei terminali dopo avere eseguito: Rispettivamente il server e il client:
codice:dario@ubuntu:~$ cd Scrivania/Esercizi\ socket/ dario@ubuntu:~/Scrivania/Esercizi socket$ ./Server My address/port: 127.0.0.1:2000 Client from 127.0.0.1/47440 connected
codice:dario@ubuntu:~/Scrivania/Esercizi socket$ ./Client 127.0.0.1 2000 CIAO

Rispondi quotando