Newsgroup: it.comp.os.linux.development
Titolo: semplice prog client/server

Abbiamo implementato un semplice sistema client-server in cui un server apre
una socket nel dominio AF_INET e su una porta stabilita e offre servizi.
Il client si connette a questo server.
Se testiamo il tutto sulla stessa macchina, funziona. Se proviamo con due
host differenti di uno stesso laboratorio, non va (il problema è sulla
funzione connect del client,che da errore).
Alleghiamo il codiceper chiunque ci possa aiutare.
Il codice del server non e' completo ma vi assicuro che le parti mancanti
vanno bene.
-----FILE server.c-----
#include "server.h"
main() {
	int cod_sem = 50;
	sem = crea_sem(cod_sem); /* creo e inizializzo un semaforo */
	par_conf(&num,lis); /* leggo il numero delle configurazioni e la lista dei
comandi */
	signal(SIGINT,handler); /* dal programma si esce con CTRL+C */
	signal(SIGCHLD,SIG_IGN); /* ignoro la chiusura di figli terminanti */
	sock = inizializza_socket(); /* creo il socket */
	sock_passivo(sock,num); /* creo una coda in ingresso al socket */
	while(1) {
		cl_sock = accetta_connessione(sock);
		if (fork() == 0) {
			close(sock);
			while(1) {
				read(cl_sock,buf,sizeof(buf)); /* leggo una richiesta */
				printf("messaggio del client = %s\n",buf);
				wait_sem(sem);
				if (strcmp(buf,"quit")==0) break;
                                esegui(buf,ris,lis);
				write(cl_sock,ris,sizeof(buf));
				bzero(buf,sizeof(buf));
				bzero(ris,sizeof(ris));
				signal_sem(sem);
		}
		close(cl_sock);
		exit(0);
	}
}
}
-----FILE client.c-----
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
main() {
	int ds_sock,length,res;
	struct sockaddr_in client;
	struct hostent *hp;
	char buff[1024];
	char dom[1024];
	ds_sock = socket(AF_INET,SOCK_STREAM,0);
	printf("uno\n");
	client.sin_family = AF_INET;
	client.sin_port = 4100;
	printf("Digitare il nome dell'host del rpcserver\n");
	scanf("%s",dom);
	hp = gethostbyname(dom);
	bcopy(hp->h_addr, &client.sin_addr, hp->h_length);
	res = connect(ds_sock,(struct sockaddr *) &client,sizeof(client));
	if( res == -1) {
		printf("Errore nella chiamata connect \n");
		exit(1);
	}
	printf("rpc client (digitare quit per terminare)\n");
	while(1) {
		printf(">");
		scanf("%s",buff);
		write(ds_sock,buff,sizeof(buff));
		if (strcmp(buff,"quit")==0) break;
		read(ds_sock,buff,sizeof(buff));
		printf("%s\n",buff);
	}
	close(ds_sock);
}
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

acroqv wrote:
[cut]

veramente dovevi postarlo tutto, almeno la funzione accetta connessione... 

il codice mi sembra corretto, io penso che dipende da come viene gestita la
rete dei computer sul quale fate partire il server... Alcuni server
"mascherano l' ip"... IMHO devi vedere come viene gestita la rete nei
computer del laboratorio...
ciao by JSMR
-- 
Esistono 10 tipi di persone al mondo, quelli che conoscono
il codice binario e quelli che non lo conoscono.

> veramente dovevi postarlo tutto, almeno la funzione accetta connessione...
Posto anche la parte del codice che si occupa delle socket
#include "sockets.h"
     2:
     3:
     4:
     5: int inizializza_socket () { /* inizializza un socket sulla porta 25000 */
     6: struct sockaddr_in server;
     7: int sock;
     8:
     9: /* crea un socket nel dominio Internet */
    10: sock = socket(AF_INET,SOCK_STREAM,0);
    11: if (sock<0) {
    12: perror("socket");
    13: exit(1);
    14: }
    15:
    16: /* crea la struttura indirizzo del socket */
    17: server.sin_family = AF_INET;
    18: server.sin_port = 25000;
    19: server.sin_addr.s_addr = INADDR_ANY;
    20:
    21: /* da il nome al socket creato */
    22: if (bind(sock, (struct sockaddr *)&server, sizeof(server)) < 0) {
    23: perror("bind");
    24: exit(1);
    25: }
    26: return(sock);
    27: }
    28:
    29: void sock_passivo (int sock,int coda) { /* pone il socket in attesa di
connessioni */
    30: if (listen(sock,coda) < 0) {
    31: printf("Errore nella creazione della coda sulla socket");
    32: exit(1);
    33: }
    34: }
    35:
    36: int accetta_connessione(int sock) {
    37: int cl;
    38: if (( cl = accept(sock,0,0)) < 0) {
    39: printf("Errore nell'accept su nuova connessione");
    40: exit(1);
    41: }
    42: return(cl);
    43: }
    44:
    45:
C


 ha scritto nel messaggio
news:151Z100Z8Z52Y1...@usenet.libero.it...
