PDA

View Full Version : maledetto socket C


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

akyra
08-06-2004, 17:00
scusate, il penultimo comando:

printf("\nServer: Primo Comando: %c \n", comandi[0][0]);

e' da intendersi come

printf("\nServer: Primo Comando: %s \n", comandi[0]);

akyra
08-06-2004, 17:52
scusate...sono un pirla....mi sono risposto da solo.....ho risolto......

gurutech
08-06-2004, 19:03
ciao,
se ti interessa qui ho messo un po' di esercizi sui socket che ho fatto per l'esame di informatica 2

http://www.gurutech.it/index.php?sel=polimi/info2