Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    [C - Rete] Programma client, aiuto progettazione e suggerimenti!

    Ciao a tutti, devo svolgere questo esercizio di programmazione di rete con linguaggio C:

    1) Un processo STUD crea ed utilizza un canale CNL_TX tra se stesso e il server VRF_TX e un secondo canale CNL_RX tra se stesso e un server di verifica VRF_RX
    2)Il processo STUD entra in un ciclo dove per ogni itarazione:
    -effettua una richiesta di collegamento a VFR_TX (Porta 37998)
    -effettua una richiesta di collegamento a VFT_RX (Porta 37898)
    -STUD invia sul canale CNL_RX il conteggio degli errori di trasmissione verificatisi durante la verifica (convertito da una sequenza di caratteri terminata da '\n'
    -dopo STUD riceve da VFR_TX una sequenza di caratteri alfanumerici (SEQ_LUNGH max 256 caratteri)
    -Sul canale CNL_RX il processo STUD deve inviare a VFR_RX ogni singolo carattere ricevuto (invia come ultimo carattere '\n')
    3)STUD chiude i canali di rete.

    Per risolvere il problema ho impostato il seguente schema:

    Un processo P crea i canali per la comunicazione e successivamente (dopo aver dichiarato le variabili) forka in un figlio F, e poi va in wait. Ottengo cosi un figlio (del padre P) che a sua volta forka in un nipote N (figlio del figlio F). Una volta fatto ciò i processi F e N effettuano una richiesta di connessione a VFR_RX (F) una richiesta di connessione a VFR_TX (N). A questo punto F conteggia gli errori tramite un ciclo in cui incremento un indice, fratto ciò invio a VFR_RX il conteggio degli errori. A questo punto il processo F va in wait (attende la fine del processo N). Il processo N intanto fa una recive e riceve i caratteri. Una volta trasformati fa una exit e passa al padre (F) i caratteri ricevuti. A questo punto F invia ogni singolo carattere a VRF_RX e fa una exit restituendo il controllo al processo P. P chiude le connessioni.

    Secondo voi come schema logico è corretto? Qualche errore? Avete suggerimenti? Ora sto scrivendo il codice, più tardi ve lo posto. Grazie a tutti coloro che riusciranno a darmi una mano!

  2. #2
    questo è il codice che ho generato, decisamente diverso dallo schema indicato prima:

    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <netinet/in.h>
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <string.h>
    
    #define SERVER_IP "192.168.2.1" // IP del server
    #define PORTA1 27789 // Porta del server VRF_RX
    #define PORTA2 27898 // Porta del server VRF_TX
    #define MAXNUM 256 // Massimo numero di caratteri ricevibili
    
    void addr_initialize (struct sockaddr_in *pt, unsigned int TCP_port, unsigned int IP_addr) {
    	
    	pt -> sin_family = AF_INET;
    	pt -> sin_port = htons ((unsigned short int) TCP_port);
    	pt -> sin_addr.s_addr = IP_addr;
    
    }
    
    int main()
    {
    	int sd1, sd2;
    	struct sockaddr_in s1_addr;
    	struct sockaddr_in s2_addr;
    	int s1_len=sizeof(s1_addr);
    	int s2_len=sizeof(s2_addr);
    	int err1, err2, error, error1;
    	char quit[5]"quit\n";
    	char errore[5];
    	char ch='\n';
    	int len;
    	char seq[5];
    	int i,j,term;
    	char msg[256];
    
    	error=0;
    	error1=0;
    
    	sd1=socket(AF_INET, SOCK_STREAM, 0);
    	sd2=socket(AF_INET, SOCK_STREAM, 0);
    	addr_init(&s1_addr, PORT1, inet_addr(SERVER_IP));
    	addr_init(&s2_addr, PORT2, inet_addr(SERVER_IP));
    
    	do {
    		i=0;
    		term=0;
    		err1 = connect(sd1, (struct sockaddr*)&s1_addr, s1_len); /*ripetere con 2 al posto di 1*/
    		if(err1!=0) { 
    			printf("\nConnessione fallita: termino per errore");
    			exit(-1);
    		}
    		
    		err2 = connect(sd2, (struct sockaddr*)&s2_addr, s2_len); 
    		if(err2!=0) {
    			printf("\nConnessione fallita: termino per errore");
    			exit(-1);
    		}
    
    	sprintf(errore, "%d\n", error);
    	send (sd2, errore, strlen(errore),0);
    	
    	while (seq[i-1] != ch) {
    		recv(sd1, &seq[i],1,0);
    		i++;
    		}
    
    	seq[i-1]='\0';
    	len = atoi(seq);
    	
    	for(j=0;j<len;j++) {
    		recv (sd1, &msg[j],1,0);
    		byte = send (sd2, &msg[j],1,MSG_NOSIGNAL);
    		if(byte == -1) error1++;
    	}
    
    	if(error1 > error){
    	error=error1;
    	close(sd1);
    	close(sd2);
    	continue;
    	}
    
    	send(sd2, &ch,1,0);
    	
    	for(i=0; i<5;i++){
    	if(msg[i]==quit[i]) term=1;
    	}
    
    close(sd1);
    close(sd2);
    
    	}while(term!=1);
    
    return 0;
    
    }
    che ne dite? funziona? Ci sono errori rilevanti o cose non corrette?
    Grazie ancora una volta!

  3. #3
    Un processo STUD crea ed utilizza un canale CNL_TX tra se stesso e il server VRF_TX e un secondo canale CNL_RX tra se stesso e un server di verifica VRF_RX
    Ufficio complicazioni affari semplici, in pratica.
    Qualcuno ha gia mandato aff***** il prof? Spero di si.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  4. #4
    guarda meglio lasciar stare, che il testo completo è ancora meno chiaro! Sapresti darmi qualche consiglio?

  5. #5
    Come potrei? Hai letto la traccia?
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  6. #6
    Originariamente inviato da nicolo_conte
    guarda meglio lasciar stare, che il testo completo è ancora meno chiaro! Sapresti darmi qualche consiglio?
    in che senso?

  7. #7
    Nel senso che leggendo la traccia non si può capire il senso di quello che dovresti fare.
    Rilasciata Python FTP Server library 0.5.1
    http://code.google.com/p/pyftpdlib/

    We'll be those who'll make the italian folks know how difficult can be defecating in Southern California without having the crap flying all around the house.

  8. #8
    Originariamente inviato da billiejoex
    Nel senso che leggendo la traccia non si può capire il senso di quello che dovresti fare.
    il fatto è che la traccia è questa! Come posso fare? Davvero non si capisce nulla?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.