[C] Come devo fare? Mi potreste dare una mano?

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
CrisLoveStefy
Linux 0.x
Linux 0.x
Messaggi: 1
Iscritto il: ven 8 giu 2007, 16:43

[C] Come devo fare? Mi potreste dare una mano?

Messaggio da CrisLoveStefy »

Salve sono Cristian vorrei chiedervi se prima di tutto ho fatto bene a impostare questo codice partendo dal seguente testo dell'elaborato d'ammissione dell'esame (sono veramente pallosi sti elaborati a dire la verità- comunque).

Il testo che ci è stato assegnato è:

Creare un client con le seguenti specifiche entro 1 settimana:

1) Accetta a riga di comando la seguente sintassi:
server.exe [IP] [PORTA] messaggio]
secondo me viene in mente un'esempio del tipo
server.exe 137.204.72.5 9988 messaggiodiprova
2) Si connette A IP+PORTA
3) Legge una stringa A di 10 byte....quale? come deve essere questa stringa? Lui dice del tipo 0000000127.....come si fa?
4) Scrive una strnga B di 100 bytes concatenando il proprio nome,cognome,matricola sd A. E poi dice per riempire i caratteri mancanti usate lo spazio
5) Scrive un'intero C di 4 bytes (header) indicando quanti caratteri N spedirà in futuro. N= strlen(messaggio) che cosa vuol dire?
6) Scrive una stringa D di N caratteri
7) Legge una stringa E di 2 bytes : a. se E = "OK" il client ha avuto successo b. se E = ER il client ha commesso un errore del protocollo.

E quindi cosa devo fare? un menu? A-E .
Non ho capito o forse sono scemo?

Da quello che ho capito:
- il client prende in input da linea di comando ip e porta del server ed un messaggio
- il client richiede all'utente di inserire un testo di max 10 caratteri e lo legge
- il client crea una stringa contenente nome,cognome,matricola e il messaggio preso al passo precedente, andando a creare una stringa da 100 byte (mettendo tanti spazi bianchi in coda quanti servono per arrivare precisi a 100 caratteri)
- il client invia al server quanto generato al passo precedente
- il client invia al server un valore a 32bit contenente la lunghezza del messaggio preso da linea di comando quando è stato lanciato
- il client invia al server il messaggio preso da linea di comando e la cui lunghezza è stata calcolata e inviata al passo precedente
- il cliente legge la risposta del server (2 caratteri), se è OK scrive a video che tutto è andato bene, se è ER scrive a video che il protocollo non è stato rispettato.

Mi è stato dato questo server di prova da lanciare contemporaneamente sullo stesso PC.
Questo è il collegamento per scaricare i due file .
Dovreste compilare con il gcc -o client.exe client.c

e far partire 2 console:

Per lanciare il server di prova:

./server 9999 log.txt 1 messaggio

Per lanciare il client di prova:
./client 127.0.0.1 9999 messaggio

http://www.4shared.com/dir/967499/e4aea6a7/sharing.html.


Questo è il mio client

Codice: Seleziona tutto


#include <stdio> 
#include <string> 
#include <netinet> 
#include <stdlib> 
#include <sys> 
#include <arpa> 
#include <sys> 
#include <unistd> 

int main(int argc, char*argv[]) 
{ 
   struct sockaddr_in Serv; 

   int sock,i; 
  /* Dichiarazione dei messagg di scambio
   char messaggio[1000]; 
   char msg1[1000];
   char msg2[1000];
   char msg3[1000];
  */
   
   char matricola[7]="240140"; // Dichiarazione della matricola

   char ip[100]; //Dichiarazione dell'IP
   char nome[17]="cristian,capannini";  //Dichiarazione del nome e cognome
   strncpy(ip,argv[1],99); //Ricevo l'argomento e lo metto in ip
   sock=socket(AF_INET,SOCK_STREAM,0); 

   memset((void*)&Serv,0,sizeof(Serv)); // è una funzione che non ricordo bene come definirla
   Serv.sin_family=AF_INET; 
   Serv.sin_addr.s_addr=inet_addr(ip); 
   Serv.sin_port=htons(9977); //numero della porta 

   nome[17]='\0'; 
   matricola[7]='\0'; 

   if(connect(sock,(struct sockaddr*)&Serv,sizeof(Serv))==-1) 
   { 
      printf("Connect"); 
      exit(1); 
   } 

   printf("%s\n",nome); 
   printf("%s\n",matricola); 

   //ricevo la stringa da 15 

   recv(sock,messaggio,15,0); 

   strcat(messaggio,nome);  //concateno il nome con la stringa

   for(i=27;i<50;i++) 
   {
      messaggio[i]='+'; //mette a più i caratteri restanti
   }
   messaggio[50]='\0';
 
   printf("%s\n",messaggio); 

   send(sock,messaggio,50,0); manda al socket il messaggio
    
   //ricevi la stringa da 20 

   recv(sock,msg1,20,0); ricevi dal socket il messaggio

   strcat(msg1,matricola); 

   for(i=26;i<49;i++) 
   {
      msg1[i]='*'; /* mette a * i caratteri restanti 
   }
   msg1[49]='\0'; 

   printf("%s\n",msg1); 

   send(sock,msg1,49,0);  manda al socket il msg1
    
   //scrivere stringa da 39 

   strncpy(msg2,messaggio,15); 

   msg2[15]='\0'; 

   strcat(msg2,matricola); 

   for(i=21;i<39;i++) 
   {
      msg2[i]='>'; 
   }
   msg2[39]='\0'; 

   printf("%s\n",msg2); 

   send(sock,msg2,39,0); manda al socket il msg2

   //ricevere una stringa da 7 

   recv(sock,msg3,7,0); //ricevi dal socket il messaggio

   printf("%s\n",msg3); 

   close(sock); // chiude il socket

   return(0); 
}

Come dovrei fare?

Avatar utente
gioco
Packager
Packager
Messaggi: 900
Iscritto il: dom 19 giu 2005, 0:00
Slackware: last stable
Località: in the court of the Wesnoth king
Contatta:

Re: [C] Come devo fare? Mi potreste dare una mano?

Messaggio da gioco »

CrisLoveStefy ha scritto:Come dovrei fare?
Ma sei in cerca di qualcuno che te lo fa? :badgrin:

Comunque, l'elaborazione mi sembra sequenziale (il client si connette, legge l'input dell'utente, invia, riceve) niente menu. L'interpretazione che hai scritto mi sembra giusta, solo il codice non mi sembra tanto aderente a quello che tu stesso hai scritto di aver capito.

Ti consiglio ti postare dubbi specifici, altrimenti non ti aiuta nessuno :p
Questo: http://gapil.truelite.it/ può esserti molto utile, così come le pagine di man.

Rispondi