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.
Grazie per l'attenzione =)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*/ }

Rispondi quotando