Programma in C (su Unix) : Client - Server (mediante UDP)

Discuti dei problemi relativi alla programmazione nel tuo linguaggio preferito!

Moderatori: cb_123, thrantir, tonertemplum

Programma in C (su Unix) : Client - Server (mediante UDP)

Messaggiodi Massimo78 il 21 apr 2004, 16:59

Sto realizzando in C questi 2 programmi.

L'esercizio è fare un programma server che resta in background in ascolto su una porta, e un programma client che lanciato (come il server) da riga di comando sia in grado di trasmettere delle stringhe al server.
Una volta fatta questa operazione il server dovrà metterle a video, convertendo la stringa in Uppercase.

io fin ora ho fatto questi due programmi ma c'è qualcosa che on va... se qualcuno è volenteroso e gli va di darmici una debuggata mi fa piacere :)

PROGRAMMA SERVER :
Codice: Seleziona tutto
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
#include <unistd.h>
#include <wctype.h>
                                                                                                                             
#define TRUE            1
#define FALSE           0
#define MSGLEN         100
                                                                                                                             
int pid;
int rett;
                                                                                                                             
        int gen_chan, gen_addrlen, channel;
        char buffer[MSGLEN], msg_tocli[MSGLEN];
        struct sockaddr_in gen_addr, chan_addr;
        struct hostent * hp, * gethostbyname();
        int rbcount, rnbcount, rerr_flag, rend_flag,
            wbcount, wnbcount, werr_flag, i;
                                                                                                                             
void leggiporta()
        {
        printf("Sono in leggiporta\n");
        rnbcount=0;
        rbcount = recvfrom(gen_chan,buffer,MSGLEN,0,(struct sockaddr*)&gen_addrlen, &gen_addrlen);
        for (i=0;i<buffer[0];i++) {
        buffer[i]=towupper(buffer[i]);
        }
        printf("\nserver: message received => %s\n",buffer);
        strcpy (msg_tocli,"OK!");
        wbcount = sendto(gen_chan,msg_tocli,MSGLEN,0,(struct sockaddr*)&gen_addrlen, gen_addrlen);
        }
main(argc,argv)
int argc;
char **argv;
{
//      socket
        if ((gen_chan=socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1){
                           perror("\n[server s (init)]");
                           exit(1);
                           }
                                                                                                                             
//      riservata solo all'udp
        gen_addr.sin_family = AF_INET;
        gen_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        gen_addr.sin_port=htons(atoi(argv[1]));
        gen_addrlen = sizeof(gen_addr);
// binding
        if (bind( gen_chan,(struct sockaddr *) &gen_addr, gen_addrlen)==-1){printf("Bind error\n");}
        printf("\nserver: port is %d\n", ntohs(gen_addr.sin_port));
                                                                                                                             
        do {
        printf("\nserver: opening a connection \n");
        if (signal(SIGIO,SIG_IGN)!=SIG_ERR) leggiporta();
        sleep(1);
        printf("Attesa prossimo messaggio:\n");
        } while (TRUE);
}


PROGRAMMA CLIENT :
Codice: Seleziona tutto
#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <errno.h>
                                                                                                                             
#define TRUE    1
#define FALSE   0
#define MSGLEN  100
                                                                                                                             
main (argc, argv )
int argc;
char **argv;
{
        int not_error, channel, chan_addrlen;
        char msg_tosend[MSGLEN], msg_torcv[MSGLEN];
        struct sockaddr_in chan_addr;
        struct hostent *hp, *gethostbyname();
//socket
        if ((channel = socket( AF_INET, SOCK_DGRAM, IPPROTO_UDP))==-1)
                                {
                                perror("\nclient: error opening socket\n");
                                exit(1);
                                }
        bzero(&chan_addr,sizeof(chan_addr));
        chan_addr.sin_family = AF_INET;
        chan_addr.sin_addr.s_addr=htonl(INADDR_ANY);
        chan_addr.sin_port = htons (atoi(argv[2]));
        chan_addrlen = sizeof(chan_addr);
        hp = gethostbyname(argv[1]);
        bcopy (hp->h_addr, &(chan_addr.sin_addr.s_addr), hp->h_length);
        printf("\nclient: host is %s, port is %d\n", argv[1], ntohs(chan_addr.sin_port));
        not_error=TRUE;
// bind
        if (bind(channel,(struct sockaddr*)&chan_addr,chan_addrlen)==-1) perror("\nclient: error binding ");
        printf("\nclient: port is %d\n", ntohs(chan_addr.sin_port));
        do      {
                printf("\nclient: type a string => ");
                if (gets(msg_tosend) == NULL )  {
                                                close(channel);
                                                exit(1);
                                                }
// fin qui funge
                if (sendto(channel, msg_tosend, sizeof(msg_tosend), 0,(struct sockaddr*)&chan_addr,htons(atoi(argv[1])))==-1) {
                                                                perror("\nclient: error writing socket \n");
                                                                not_error = FALSE;
                                                                }
                if (recvfrom(channel, msg_torcv, sizeof(msg_torcv), 0,(struct sockaddr*)&chan_addr,&chan_addrlen)==-1) {
                                                                perror("\nclient: error reading socket \n");
                                                                not_error = FALSE;
                                                                }
                printf("\nclient: this is the answer => %s\n", msg_torcv);
        }       while (not_error);
        close(channel);
}


Grazie
Massimo78
Cittadino verde
Cittadino verde
 
Messaggi: 46
Iscritto il: 19 apr 2004, 09:53
Località: Roma

 

Messaggiodi Massimo78 il 21 apr 2004, 17:02

dimenticavo... l'usage è il seguente :

per il SERVER :
Codice: Seleziona tutto
server [portnumber] [ipaddress]


per il CLIENT :
Codice: Seleziona tutto
server [ipaddress] [portnumber]



Esempio :

Codice: Seleziona tutto
server 8000 127.0.0.1
client 127.0.0.1 8001
Massimo78
Cittadino verde
Cittadino verde
 
Messaggi: 46
Iscritto il: 19 apr 2004, 09:53
Località: Roma

Messaggiodi Carlito Brigante il 13 apr 2005, 14:14

Se piu' tardi ho tempo ci do un'occhiata. Il problema si verifica solo a runtime o ti segnala anche qualche warning in fase di compilazione ?
"Non posso portarti con me in questo viaggio. Me ne sto andando, lo sento... Ultimo giro di bevute, il bar sta chiudendo, il sole se ne va... Dove andiamo per colazione?! Non troppo lontano... Che nottata... Sono stanco, amore... Stanco..."
Avatar utente
Carlito Brigante
Saggio del pianeta
Saggio del pianeta
 
Messaggi: 347
Iscritto il: 30 mag 2004, 00:41
Località: Montignoso


Torna a Programmare

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite