PDA

Visualizza la versione completa : Servizio echo con socket TCP


sky_451
02-05-2006, 13:16
Salve a tutti ecco i codici che ho provato a fare:
Client:


#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:


#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... :bh:
Grazie.

sky_451
02-05-2006, 18:13
Mi sono accorto che se tolgo questa parte dal client tutto funziona....Non so pi dove sbattere la testa.


/* /* 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); */

sky_451
02-05-2006, 23:23
Nessun aiuto?

:(

sky_451
03-05-2006, 10:07
Ho risolto nel server cos:


while( (len>nread) && ((returnRead=read(socketAccept,&(buffer[nread]),len-nread ))>0) )
{
nread+=returnRead;
if(buffer[nread-1] == '\0')
break; /* fine stringa */
}


:ciauz:

Loading