17/12/08 20:32
trenta3
Premetto che sono da poco entrato nelmondo della programmazione.
Avrei un problema:
Ho il codice di un banale server e di un banale client che si scambiano messaggi tra loro.
Il problema sorge quando vorrei fare in modo che il server supporti la connessioni anche di più client contemporaneamente come in una chat.
Ho cercato su internet ed ho scoperto che servirebbe un programma multiprocesso ma non riesco a capire come fare:
Il mio compilatore, Dev-c++, mi da errore quando metto il comando fork().
Grazie in anticipo a chi risponderà.(Mi basterebbe una guida ,possibilmente in Italiano ma va bene anche in Francese e in Inglese, che spieghi per bene il fork e i programmi multiprocesso.)
Metto per comodità i codici(senza fork):
Server.c
Client.c
Avrei un problema:
Ho il codice di un banale server e di un banale client che si scambiano messaggi tra loro.
Il problema sorge quando vorrei fare in modo che il server supporti la connessioni anche di più client contemporaneamente come in una chat.
Ho cercato su internet ed ho scoperto che servirebbe un programma multiprocesso ma non riesco a capire come fare:
Il mio compilatore, Dev-c++, mi da errore quando metto il comando fork().
Grazie in anticipo a chi risponderà.(Mi basterebbe una guida ,possibilmente in Italiano ma va bene anche in Francese e in Inglese, che spieghi per bene il fork e i programmi multiprocesso.)
Metto per comodità i codici(senza fork):
Server.c
/**************************** Sorgenti della guida www.fabrixosft.altervista.org www.pierotofy.it ***************************/ #include <stdio.h> #include <winsock.h> main(){ //INIZIALIZZAZIONE WINSOCK WSADATA wsadata; int Versione= WSAStartup(MAKEWORD(2,2),&wsadata); //Gestione dell'errore if(Versione!=NO_ERROR){ //o anche if(Versione != 0){ printf("Errore nell'inizializzazione delle socket"); } //*************************************** //DICHIARAZIONE E CREAZIONE DELLA SOCKET //Dichiariamo la SOCKET che verrà chiamata server SOCKET server; //Associamo alla socket "AF_INET", ovvero internet adress family (il più usato), "SOCK_STREAM", per far girare la socket sul protocollo TCP(esiste anche il tipo "SOCK_DGRAM" per usare la socket su un protocollo UDP),IPPROTO_TCP , ovvero la socket userà il protocollo TCP server=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP); //gestione dell'errore if(server==INVALID_SOCKET){ printf("Errore: Socket non valida"); //Liberiamo le risorse della socket WSACleanup(); }//************************************* //STRUTTURA SOCKADDR_IN E ASSEGNAZIONE DI PARAMETRI AL SERVER SOCKADDR_IN parametri_server; //Come detto prima passiamo la internet address family parametri_server.sin_family=AF_INET; //ora diciamo su che indirizzo IP il server deve attivarsi, in questo caso 127.0.0.1 ovvero l'host locale parametri_server.sin_addr.s_addr = INADDR_ANY; //In questo modo faremo collegare da remoto il clien altrimenti mettere "inet_addr("127.0.0.1");" //Ora passiamo al server la porta di connessione, in questo caso la 1000 parametri_server.sin_port=htons(1000); //************************************************************ //FUNZIONE BIND int funzione_bind; funzione_bind=bind( server, (SOCKADDR*) ¶metri_server, sizeof(parametri_server)); if(funzione_bind ==SOCKET_ERROR ){ /*if(bind!=0){ printf("Funzione bind non riuscita\n");*/ //Chiudiamo correttamente la socket printf("Errore\n"); closesocket(server); WSACleanup(); } //**************************************************** //FUNZIONE LISTEN(); RIMANE IN ASCOLTO int funzione_listen; funzione_listen=listen(server,1); if(funzione_listen ==SOCKET_ERROR) //Gestione dell'errore printf("Errore nella funzione listen \n"); //************************************ //FUNZIONE ACCEPT(); ACCETTA LA CONNESSIONE //Creiamo un elemento di tipo SOCKET SOCKET Accetta_connessioni; //ciclo infinito che attende la connessione printf("Attendo la connesione d un client\n"); while(1){ //dichiariamo la SOCKET Accetta_connessioni come errore ... Accetta_connessioni=ERROR; //in modo da innestare un altro ciclo while che si interrompe solo quando la SOCKET Accetta_connessioni non è più ERROR, ovvero finchè non avviene la connessione con un client. while(Accetta_connessioni==ERROR){ //La struttura della accept deve prendere 3 parametri, l primo obbligatorio e gli altri opzionali, a noi interessa solo il primo parametro(ovvero SOCKET server) e in questa guida non spiegherò a cosa servono gli altri 2 che setteremo a NULL Accetta_connessioni=accept(server,NULL,NULL); } //Se il ciclo si interrompe significa che un client si è connesso printf("Un client ha effettuato una connessione!"); //Assegnamo alla SOCKET server la socket Accetta_connessioni. server=Accetta_connessioni; //con un break; usciamo dal ciclo infinito break; } //******************************** //FUNZIONE RECV PER LA RICEZIONE DEI DATI //Dichiariamo il buffer contenente i dati ricevuti int ricevuto; char ricezione_dati[100]; do{ //Funzione recv per ricevere i dati recv(server,ricezione_dati,100,0); //Outputiamo i dati ricevuti printf("\nHo ricevuto >>> %s ",ricezione_dati); //Il ciclo continua finchè non viene digitato "Chiuditi" }while(strcmp(ricezione_dati,"Chiuditi")!=0); getchar(); //************************************* }
Client.c
/**************** Sorgenti della guida www.fabrixsoft.altervista.org www.pierotofy.it ****************/ #include <stdio.h> #include <winsock.h> char IP[20]; main(){ //Richiediamo all'utente l'IP e lo memorizziamo printf("Digita l'IP di connessione >>>"); scanf("%s",IP); //Inizializziamo il Winsock WSADATA wsadata; int Valore; Valore = WSAStartup( MAKEWORD(2,2), &wsadata ); if ( Valore != NO_ERROR ) printf("Errore nell'inizializzazione\n"); //************************ //Creiamo la socket SOCKET client; client= socket( AF_INET, SOCK_STREAM, IPPROTO_TCP ); //Gestione dell'errore if ( client== INVALID_SOCKET ) { printf("Errore nella creazione della socket\n"); //Liberiamo le risorse del winsock WSACleanup(); } //**************************** //ASSEGNAMO DEI PARAMETRI AL CLIENT SOCKADDR_IN parametri_client; //internet adress family parametri_client.sin_family = AF_INET; //Mettiamo come IP di connessione quello immesso dall' utente parametri_client.sin_addr.s_addr = inet_addr( IP ); //porta numero 1000 parametri_client.sin_port = htons( 1000); //********************************** //FUNZIONE CONNECT(); //Dichiaro una variabile int connessione int connessione; //assegno a connessione la funzione connect(); connessione=connect(client,(SOCKADDR*) ¶metri_client,sizeof(parametri_client)); //Gestione dell'errore if( connessione == SOCKET_ERROR){ printf("Connessione fallita \n"); //Chiudo la scoket closesocket(client); WSACleanup(); } //***************************** //Dichiaro un buffer dove salverò il messaggio che verrà digitato dall'utente char invio_dati[100]; do{ printf("Digita il messaggio da inviare al server >>> "); //Prendo il messaggio fflush(stdin); _sleep(100); gets(invio_dati); //Invio il messaggio send(client,invio_dati,100,0); //Il ciclo si ripete finche non viene digitato "Chiuditi" }while(strcmp(invio_dati,"Chiuditi")!=0); //Aspetto la pressionde di un tasto e chiudo il programma getchar(); return 0; }
Ultima modifica effettuata da trenta3 17/12/08 20:34
aaa