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

    [C] Processo client/server (gestione client in parallelo)

    Anzitutto un ciao a tutti, visto che è la prima volta che posto qui =)
    Ora passo direttamente al problema:
    devo programmare sotto ambiente Linux un server con le seguenti caratteristiche
    -il processo padre SRV genera SRV_1 e SRV_2, che gestiscono 2 canali tra loro e 2 client (CLI_1 e CLI_2)

    1) SRV_X entra in ciclo e:
    -riceve da CLI_X una sequenza di caratteri (max 5) terminata da '\n', che viene convertita in formato numerico (IDX)
    -apre il file 'term.txt', legge il carattere alla posizione IDX, lo memorizza e chiude il file. Il char letto diventa CH_TERM
    -riceve un'altra sequenza di caratteri (max 64), il cui ultimo carattere è il CH_TERM di cui sopra
    -conta il numero di caratteri ricevuti in questo modo e reinvia al client il conteggio

    2) Il ciclo termina quando SRV_X legge dal file un carattere CH_TERM corrispondente a 'q'
    3) SRV_X chiude il canale
    4) SRV chiude il canale usato e termina (senza aspettare il termine dei servizi)

    Qui sotto riporto un sorgente buttato giù in fretta; sottolineo che ho pochissima dimestichezza con la funzione 'fork' e che non conosco i comandi per far aprire e scorrere un file.


    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/socket>
    #include <netinet/in.h>
    #include <string.h>
    
    #define MAXCONN 5
    #define SRVPORT 37501
    
    void addr_initialize(struct sockaddr_in *addr,int port, long ip){
    addr->sin_family=AF_INET
    .....
    .....
    }
    
    int main(){
    int sd,sd1,sd2,i,IDX,n,pid1,pid2;
    struct sockaddr_in server,client1,client2;
    int srvlen=sizeof(server);
    int clilen1=sizeof(client1);
    int clilen2=sizeof(client2);
    char ch,lun[5],seq[64],CH_TERM;
    char TERM='\n';
    
    sd=socket(AF_INET,SOCK_STEAM,0);
    if(sd==-1){
    /* errore, chiudo connessione (non lo sto a scrivere ogni volta se no non finisco + ;p) */
    }
    bind(...);
    listen(...);
    
    sd1=accept(sd,(struct sockaddr_in*)&client1,clilen1);
    if(...)  /* solito controllo */
    
    sd2=accept(sd,(struct sockaddr_in*)&client2,clilen2);
    if(...) /* solito controllo */
    
    pid1=fork();
    pid2=fork();
    
    if(pid1==0){
    i=0;
    do{
    n=recv(sd1,&lun[i],1,0
    }
    if(...) /*controllo sulla receive*/
    i++ }
    while(lun[i-1]!=TERM);
    IDX=atoi(lun); /*per convertire il numero di caratteri*/
    
    /*a questo punto vuoto totale: devo fargli aprire il file, fargli leggere il char alla posizione IDX-esima; oltre a questo c'è il fatto che non so se l'uso della fork fosse corretto, nè se effettivamente i client verranno gestiti in parallelo..
    il tutto poi lo riscriverei per gestire client2*/
    
    }
    Grazie per l'attenzione =)

  2. #2
    codice:
    int srvlen=sizeof(server);
    int clilen1=sizeof(client1);
    int clilen2=sizeof(client2);
    il tipo int è sbagliato, usa il tipo size_t.
    Per il resto più che dirti di cominciare a scrivere, e a studiarti bene il C (hai detto che non conosci la gestione dei file ...), non so' che dirti ...




  3. #3
    Originariamente inviato da menphisx
    codice:
    int srvlen=sizeof(server);
    int clilen1=sizeof(client1);
    int clilen2=sizeof(client2);
    il tipo int è sbagliato, usa il tipo size_t.
    Per il resto più che dirti di cominciare a scrivere, e a studiarti bene il C (hai detto che non conosci la gestione dei file ...), non so' che dirti ...



    Il tipo int è giusto, tant'è che che negli altri programmi mi ha sempre funzionato (tra l'altro il mio stesso libro di C lo usa in questo modo).
    Per quanto riguarda la gestione dei file mi attendevo proprio le righe di codice per fare quanto detto nel primo post =p

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.