Salve a tutti ecco i codici che ho provato a fare:
Client:
codice:
#include<unistd.h>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<arpa/inet.h>
#include<errno.h>
#define MAXSIZE 10
int main(int argc, char *argv[])
{
/* Variabili */
struct sockaddr_in Serv;
char remoteIpAddress[30] = "151.1.244.200"; /* www.html.it */
short int remotePortNumber = 8888;
int socketfd, ris;
struct hostent * host;
char msg[MAXSIZE];
char buffer[MAXSIZE];
int i, len, nwrite, nread, n;
/* azzero l'area della struct */
memset(&Serv, 0, sizeof(Serv));
/* imposto il messaggio da inviare al server */
for(i=0; i<MAXSIZE; i++)
msg[i] = 'a';
msg[MAXSIZE-1] = '\0';
/* creo la socket per il client */
if((socketfd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
perror("Errore nella creazione della soccket");
exit(1);
}
if(argc > 1)
{
/* risoluzione indirizzo tramite il DNS */
if((host = gethostbyname(argv[1])) == NULL)
{
printf("Errore nella risoluzione del nome del dominio\n");
exit(1);
}
/* setto sin_addr per l'host remoto */
memmove((char *)&Serv.sin_addr, (char *)host->h_addr_list[0], 4);
}
else
{
if((Serv.sin_addr.s_addr = inet_addr(remoteIpAddress))== INADDR_NONE)
{
printf("Errore nella inet_addr\n");
exit(1);
}
}
/* setto la struct soccaddr_in per l'host remoto (n.b. il campo sin_addr è già settato) */
Serv.sin_family = AF_INET;
Serv.sin_port = htons(remotePortNumber);
/* Debug */
printf("mi sto per connettere a: %s\n", inet_ntoa(Serv.sin_addr));
/* richiesta connessione */
if((ris = connect(socketfd, (struct sockaddr*) &Serv, sizeof(Serv))) == -1)
{
perror("Errore durante la connessione");
exit(1);
}
/* Effettuo la scrittura del messaggio da inviare al server sulla socket */
len = strlen(msg) + 1;
nwrite = 0;
while((n = write(socketfd, &(msg[nwrite]), len-nwrite)) > 0)
nwrite += n;
printf("Scrittura eseguita\n");
/* Effettuo la lettura della risposta del server */
nread=0;
while((len > nread) && ((n = read(socketfd, &(buffer[nread]), len-nread)) >0))
{
nread += n;
printf("read effettuata, risultato n=%d len=%d nread=%d len-nread=%d\n", n, len, nread, len-nread);
fflush(stdout);
}
/* Stampo la risposta del server */
printf("Il server dice: %s\n", buffer);
fflush(stdout);
/* chiusura */
if((close(socketfd)) == -1)
{
perror("Errore durante la chiusura della socket");
exit(1);
}
return 0;
}
e il server:
codice:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <string.h>
#include <errno.h>
#include <netdb.h>
#define SIZEMSG 1000000
int main(int argc, char* argv[]){
struct sockaddr_in Local;
int returnSocket,socketAccept,returnListen,returnWrite,returnRead,returnBind;
int nwrite,nread,len,i,porta;
char buffer[SIZEMSG];
memset((void *)&Local,0,sizeof(Local));
/* Controllo prametri passati da comando */
if(argc!=2){
puts("Errore, mancano alcuni parametri fondamentali:");
puts("Usage: ./server numeroPorta");
exit(EXIT_FAILURE);
}
/* Apertura socket */
porta=atoi(argv[1]);
returnSocket = socket(AF_INET,SOCK_STREAM,0);
if(returnSocket==-1)
{
perror("Errore nella creazione del socket");
exit(EXIT_FAILURE);
}
/* Riempiamo la struttura coi dati necessari alla connessione ed effettuo la bind() */
Local.sin_family = AF_INET;
Local.sin_port = htons(porta);
Local.sin_addr.s_addr = htonl(INADDR_ANY);
returnBind = bind(returnSocket,(struct sockaddr*)&Local,sizeof(Local));
if(returnBind == -1){
perror("Errore nella funzione bind()");
exit(EXIT_FAILURE);
}
/* Effettuo la listen() */
returnListen = listen(returnSocket,10);
if(returnListen == -1){
perror("Errore nella funzione listen()");
exit(EXIT_FAILURE);
}
printf("In stato di listen\n");
/* Effettuo la accept() */
while(1)
{
socketAccept = accept(returnSocket,(struct sockaddr *)NULL,NULL);
if(socketAccept == -1){
perror("Errore nella funzione accept()");
exit(EXIT_FAILURE);
}
printf("Ho accettato la connessione di un client\n");
/* Eseguo la lettura del client */
len = 15;
nread = 0;
while( (len>nread) && ((returnRead=read(socketAccept,&(buffer[nread]),len-nread ))>0) )
nread+=returnRead;
printf("Stringa ricevuta dal client: %s\n",buffer);
fflush(stdout);
/* Eseguiamo la scrittura */
nwrite = 0;
len = strlen(buffer) + 1;
while ( (returnWrite=write(socketAccept,&(buffer[nwrite]),len-nwrite)) > 0 )
nwrite+=returnWrite;
printf("Ho inviato: %s al client\n", buffer);
fflush(stdout);
close(socketAccept);
printf("Ho chiuso la connessione con il client\n");
fflush(stdout);
}
return 0;
}
Il problema è sicuramente nel server perchè il client l'ho provato con un'altra versione del server e funziona. In pratica quando lancio il client si pianta. Non capisco proprio dove sto sbagliando...
Grazie.