Pagina 1 di 1

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

MessaggioInviato: 21 apr 2004, 16:59
di Massimo78
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

MessaggioInviato: 21 apr 2004, 17:02
di Massimo78
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

MessaggioInviato: 13 apr 2005, 14:14
di Carlito Brigante
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 ?