akyra
08-06-2004, 16:54
non mi so spiegare come mai un programmino semplice che fa comunicare un lato client e un lato server su una stessa macchina, non funzioni a dovere...
il lato client e' il seguente:
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/un.h> /* Per i socket AF_UNIX */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include "VDLib.h"
int main(int argc, char* argv[]){
int clientFd, serverLen;
int i, result, size;
Lista_comandi comandi;
struct sockaddr_un serverUNIXAddress;
struct sockaddr* serverSockAddrPtr;
serverSockAddrPtr = (struct sockaddr*) &serverUNIXAddress;
serverLen = sizeof (serverUNIXAddress);
/* Crea un socket UNIX, bidirezionale, protocollo di default */
clientFd = socket (AF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL);
serverUNIXAddress.sun_family = AF_UNIX; /* Dominio del server */
strcpy (serverUNIXAddress.sun_path, SOCK_NAME); /* Nome del server */
do { /* Stabilisce la connessione con il server */
result = connect (clientFd, serverSockAddrPtr, serverLen);
if (result == -1) sleep (1); /* Se fallisce, riprova dopo breve attesa */
} while (result == -1);
printf("\nconnessione col server stabilita\n\n");
for(i=1; i< argc; i++){
strcpy(comandi[i], argv[i]);
printf("Client: comando: %s\n", comandi[i]);
}
/*invia i comando al server*/
write(clientFd, &comandi, COMANDI_SIZE);
exit(SUCCESS);
}
in pratica il lato client ascolta gli argomenti inviati alla linea di comando, li inserisce nell'array BIDIMENSIONALE (grandezza 50*50) "comandi", quindi li scrive sul socket.
il lato server e' il seguente:
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/un.h> /* Per i socket AF_UNIX */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include "VDLib.h"
int main(int argc, char* argv[]){
int serverFd, clientFd, serverLen, clientLen, size, i;
Lista_comandi comandi;
char stringa[10];
struct sockaddr_un serverUNIXAddress; /*indirizzo del server*/
struct sockaddr_un clientUNIXAddress; /*indirizzo del client*/
struct sockaddr* serverSockAddrPtr;
struct sockaddr* clientSockAddrPtr;
serverSockAddrPtr=(struct sockaddr*) &serverUNIXAddress;
serverLen = sizeof(serverUNIXAddress);
clientSockAddrPtr= (struct sockaddr*) &clientUNIXAddress;
clientLen= sizeof(clientUNIXAddress);
/*crea un socke UNIX, protocollo di default*/
serverFd = socket (AF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL);
serverUNIXAddress.sun_family= AF_UNIX; /*dominio*/
strcpy(serverUNIXAddress.sun_path, "mioSocket"); /*nome del socket*/
unlink("mioSocket"); /*nel caso il file esista già lo rimuove*/
bind (serverFd, serverSockAddrPtr, serverLen); /*crea il file*/
listen(serverFd, 10); /*massimo numeor di connessioni possibili*/
/*loop di attesa di connesione del client*/
while(1){
clientFd= accept(serverFd, clientSockAddrPtr, &clientLen);
if(fork()==0){ /*crea il processo figlio per servire le richieste*/
printf("\nServer:leggo i comandi\n");
read(clientFd, comandi, COMANDI_SIZE);
printf("\nServer: Primo Comando: %c \n", comandi[0][0]);
}
else
close(clientFd);
}
}
il lato server non fa altro che leggere il socket, e stampare un messaggio contenente il comando inviato...il prblema è che quello che viene stampato è sempre e solo:
Server: Primo Comando: ß
e non riesco a capire perchè!!! ho provato a fare la stessa cosa con una semplice stringa di 10 caratteri, e la cosa e' riuscita...quindi perchè non dovrebbe riuscire con un array bidimensionale, di cui si conosce la dimensione???
ogni aiuto sara lautamente ricompensato....grazie a tutti fin d'ora
il lato client e' il seguente:
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/un.h> /* Per i socket AF_UNIX */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include "VDLib.h"
int main(int argc, char* argv[]){
int clientFd, serverLen;
int i, result, size;
Lista_comandi comandi;
struct sockaddr_un serverUNIXAddress;
struct sockaddr* serverSockAddrPtr;
serverSockAddrPtr = (struct sockaddr*) &serverUNIXAddress;
serverLen = sizeof (serverUNIXAddress);
/* Crea un socket UNIX, bidirezionale, protocollo di default */
clientFd = socket (AF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL);
serverUNIXAddress.sun_family = AF_UNIX; /* Dominio del server */
strcpy (serverUNIXAddress.sun_path, SOCK_NAME); /* Nome del server */
do { /* Stabilisce la connessione con il server */
result = connect (clientFd, serverSockAddrPtr, serverLen);
if (result == -1) sleep (1); /* Se fallisce, riprova dopo breve attesa */
} while (result == -1);
printf("\nconnessione col server stabilita\n\n");
for(i=1; i< argc; i++){
strcpy(comandi[i], argv[i]);
printf("Client: comando: %s\n", comandi[i]);
}
/*invia i comando al server*/
write(clientFd, &comandi, COMANDI_SIZE);
exit(SUCCESS);
}
in pratica il lato client ascolta gli argomenti inviati alla linea di comando, li inserisce nell'array BIDIMENSIONALE (grandezza 50*50) "comandi", quindi li scrive sul socket.
il lato server e' il seguente:
#include <signal.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <sys/un.h> /* Per i socket AF_UNIX */
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include "VDLib.h"
int main(int argc, char* argv[]){
int serverFd, clientFd, serverLen, clientLen, size, i;
Lista_comandi comandi;
char stringa[10];
struct sockaddr_un serverUNIXAddress; /*indirizzo del server*/
struct sockaddr_un clientUNIXAddress; /*indirizzo del client*/
struct sockaddr* serverSockAddrPtr;
struct sockaddr* clientSockAddrPtr;
serverSockAddrPtr=(struct sockaddr*) &serverUNIXAddress;
serverLen = sizeof(serverUNIXAddress);
clientSockAddrPtr= (struct sockaddr*) &clientUNIXAddress;
clientLen= sizeof(clientUNIXAddress);
/*crea un socke UNIX, protocollo di default*/
serverFd = socket (AF_UNIX, SOCK_STREAM, DEFAULT_PROTOCOL);
serverUNIXAddress.sun_family= AF_UNIX; /*dominio*/
strcpy(serverUNIXAddress.sun_path, "mioSocket"); /*nome del socket*/
unlink("mioSocket"); /*nel caso il file esista già lo rimuove*/
bind (serverFd, serverSockAddrPtr, serverLen); /*crea il file*/
listen(serverFd, 10); /*massimo numeor di connessioni possibili*/
/*loop di attesa di connesione del client*/
while(1){
clientFd= accept(serverFd, clientSockAddrPtr, &clientLen);
if(fork()==0){ /*crea il processo figlio per servire le richieste*/
printf("\nServer:leggo i comandi\n");
read(clientFd, comandi, COMANDI_SIZE);
printf("\nServer: Primo Comando: %c \n", comandi[0][0]);
}
else
close(clientFd);
}
}
il lato server non fa altro che leggere il socket, e stampare un messaggio contenente il comando inviato...il prblema è che quello che viene stampato è sempre e solo:
Server: Primo Comando: ß
e non riesco a capire perchè!!! ho provato a fare la stessa cosa con una semplice stringa di 10 caratteri, e la cosa e' riuscita...quindi perchè non dovrebbe riuscire con un array bidimensionale, di cui si conosce la dimensione???
ogni aiuto sara lautamente ricompensato....grazie a tutti fin d'ora