Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Renault Twingo E-Tech Electric: che prezzo!
Renault Twingo E-Tech Electric: che prezzo!
Renault annuncia la nuova vettura compatta del segmento A, che strizza l'occhio alla tradizione del modello abbinandovi una motorizzazione completamente elettrica e caratteristiche ideali per i tragitti urbani. Renault Twingo E-Tech Electric punta su abitabilità, per una lunghezza di meno di 3,8 metri, abbinata a un prezzo di lancio senza incentivi di 20.000€
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media
Nel Formula 1 Technology and Media Centre di Biggin Hill, la velocità delle monoposto si trasforma in dati, immagini e decisioni in tempo reale grazie all’infrastruttura Lenovo che gestisce centinaia di terabyte ogni weekend di gara e collega 820 milioni di spettatori nel mondo
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica
Il nuovo gimbal mobile DJI evolve il concetto di tracciamento automatico con tre modalità diverse, un modulo multifunzionale con illuminazione integrata e controlli gestuali avanzati. Nel gimbal è anche presente un'asta telescopica da 215 mm con treppiede integrato, per un prodotto completo per content creator di ogni livello
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 12-10-2013, 10:58   #1
moskino85
Member
 
Iscritto dal: Feb 2012
Messaggi: 36
client server scampi di messaggi

Ciao amici, spero di postare la mia domanda nella sezione giusta
Sto svolgendo un'esercizio in c che consiste nel creare un sorta di chat tra il client e il server, in pratica si scambiano messaggi fino a quando non si preme un tasto per terminare la conversazione.
Ho provato ad implementare lo scambio di messaggi e ci sono riuscito, il problema sorge quando voglio far terminar la conversazione digitando ad esempio -(il trattino). Qualcuno gentilmente potrebbe darmi un consiglio.

L'implementazione del client è:

Codice:
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
  
  
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
  
#define PROTOPORT  5193  /* default port number */ 
  
extern  int  errno; 
char localhost[] = "127.0.0.1"; /* default host name */
  
int main(int argc, char *argv[]) { 
  struct  sockaddr_in sad; /* structure to hold an IP address     */
  int     sd;              /* socket descriptor                   */
  int     port;            /* protocol port number                */
  int     n;               /* number of characters read           */
  char    buf[1000];       /* buffer for storing data from the server     */
  char    *host;    
  int     status = 1;       /*status = write*/
  
  
  memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure   */
  sad.sin_family = AF_INET;         /* set family to Internet       */
    
  if (argc > 2) {                   /* if protocol port specified   */
    port = atoi(argv[2]);           /* convert to binary            */
  } else { 
    port = PROTOPORT;               /* use default port number      */
  } 
  if (port > 0)                     /* test for legal value         */
    sad.sin_port = htons((u_short)port); 
  else {                            /* print error message and exit */
    fprintf(stderr,"bad port number %s
",argv[2]); 
    exit(1); 
  } 
  
  /* Check host argument and assign host name. */
  if (argc > 1) { 
    host = argv[1];    /* if host argument specified   */
  } else { 
    host = localhost; 
  } 
  
  sad.sin_addr.s_addr = inet_addr(host); 
    
  /* Create a socket. */
  sd = socket(PF_INET, SOCK_STREAM, 0); 
  if (sd < 0) { 
    fprintf(stderr, "socket creation failed
"); 
    exit(1); 
  }      
  
  if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) { 
    fprintf(stderr, "connect failed
"); 
    exit(1); 
  } 
  switch(status) { 
    case 1: 
      printf("(CLIENT) Scrivi il messaggio: "); 
      fgets(buf,999, stdin); /*legge una linea dallo standard output*/
      n = write(sd, buf, sizeof(buf)); 
      status = 2; 
      break; 
    case 2: 
      n = read(sd, buf, sizeof(buf)); 
      printf("(CLIENT) Ecco il messaggio ricevuto dal server: %s
", buf); 
      status = 1; 
      break; 
    } 
  close(sd); 
  /* Terminate the client program gracefully. */
  exit(0); 
}

L'implementazione del server è:

Codice:
#include <sys/types.h> 
#include <sys/socket.h> 
#include <netinet/in.h> 
#include <arpa/inet.h> 
  
#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
  
#define PROTOPORT   5193 /* default protocol port number */ 
#define QLEN        6    /* size of request queue        */ 
  
  
  
int main(int argc, char *argv[]) { 
  struct  sockaddr_in sad; /* s. to hold server's address  */
  struct  sockaddr_in cad; /* s. to hold client's address  */
  int     sd, sd2;         /* socket descriptors */
  int     port;           /* protocol port number */
  int     alen;            /* length of address  */
  char    buf[1000];       /* buffer for sending data */
  int     n; 
  char    *messaggio_ricevuto = "FINE COMUNICAZIONE"; 
  int     status = 2; 
     
  memset((char *)&sad, 0, sizeof(sad));    /* clear sockaddr s. */
  sad.sin_family = AF_INET;                /* set family to Internet */
  sad.sin_addr.s_addr = htonl(INADDR_ANY);   /* set the local IP addr  */
    
  if (argc > 1) {                           /* if argument specified        */
     port = atoi(argv[1]);                 /* convert argument to binary   */
   } else { 
     port = PROTOPORT;                     /* use default port number      */
   } 
  
   /* Verify port number */
   /* … */
  
  sad.sin_port = htons((u_short)port); 
     
  /* Create a socket */
  sd = socket(PF_INET, SOCK_STREAM, 0); 
    
  if (sd < 0) { 
    fprintf(stderr, "socket creation failed
"); 
    exit(1); 
  } 
  /* Bind a local address to the socket */
  if (bind(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) { 
     fprintf(stderr,"bind failed
"); 
     exit(1); 
  } 
  /* Specify the size of the request queue */
  if (listen(sd, QLEN) < 0) { 
     fprintf(stderr,"listen failed
"); 
     exit(1); 
  } 
  while((sd2 = accept(sd, (struct sockaddr *)&cad, &alen)) > -1) { 
    switch(status) { 
      case 1: 
        printf("(SERVER) Scrivi il messaggio: "); 
        fgets(buf, 999, stdin); 
        n = write(sd2, buf, sizeof(buf)); 
        status = 2; 
        break; 
      case 2 : 
        n = read(sd2, buf, sizeof(buf)); 
    printf("(SERVER) Ecco il messaggio ricevuto dal client: %s
", buf); 
    status = 1; 
    break; 
  } 
  close (sd2); 
   }}
Grazie a chiunque mi risponderà
moskino85 è offline   Rispondi citando il messaggio o parte di esso
Old 12-10-2013, 13:40   #2
Oceans11
Senior Member
 
L'Avatar di Oceans11
 
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
prova a descrivere il problema, è altamente probabile che ne saltino fuori altri di cui non ti sei accorto. (suggerimento: il protocollo di comunicazione da te stabilito non mi pare "robusto")
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes]
"Pirating software? Choose Microsoft!"
Oceans11 è offline   Rispondi citando il messaggio o parte di esso
Old 12-10-2013, 14:24   #3
moskino85
Member
 
Iscritto dal: Feb 2012
Messaggi: 36
Ciao Oceans11 sinceramente è la prima volta che sto implementando un client-server per questo risulta poco robusto.Comunque il mio problema è che il client e il server si inviano messaggi a vicenda e fin qui sembra che ci sono riuscito.Ora l'esercizio chiede che se il client o il server vogliono terminare questa comunicazione, bisogna premere un carattere ad esempio il trattino - in modo tale che la comunicazione tra i due termini.Ho provato a fare delle prove ma non ci sono riuscito
Ad esempio ho fatto questa prova, (ora non so se ho impostato correttamente ciò che desidero è l'ho sbagliato a posizionare nel corpo del main comunque ho scritto una cosa del genere):

Codice:
char c = '-'; //ho dichiarato questo carattere
          char buffer[256]; // questo è il buffer che utilizzo per scrivere il messaggio
if(strcmp(buffer,c)) {
    exit(0);
}
Ho fatto una prova di questo tipo ma non ho avuto i risultati desiderati.Tu cosa mi suggeriresti?
moskino85 è offline   Rispondi citando il messaggio o parte di esso
Old 12-10-2013, 17:23   #4
Oceans11
Senior Member
 
L'Avatar di Oceans11
 
Iscritto dal: Sep 2005
Città: Torino
Messaggi: 606
allora, incomincio a dirti quali sono le cose che non vanno man mano che le vedo

* il client non sta ciclando, fa un solo invio e una sola ricezione (errore logico del tuo protocollo???)

* attento a quando fai la read, non è vero che se chiedi di leggere 100 byte ti vengono letti 100 byte.

* il secondo parametro di strcmp non può essere un char ma deve essere un puntatore a char

beh, intanto mi fermo qui.
Per la robustezza del protocollo mi riferivo ai primi 2 punti. Devi cercare di capire come funzionano le socket e pensare ad un protocollo adatto, ad esempio, se la read non dà garanzie sul numero di byte letti, se non sono tutti dovresti rileggerli .

Sei uno dei pochi "novizi" (ps: lo sono anche io) che vedo utilizzare correttamente il tipo di dato restituito dalle funzioni di libreria del c.
__________________
"Se proprio dovete piratare un prodotto, preferiamo che sia il nostro piuttosto che quello di qualcun altro." [Jeff Raikes]
"Pirating software? Choose Microsoft!"
Oceans11 è offline   Rispondi citando il messaggio o parte di esso
Old 15-10-2013, 15:33   #5
moskino85
Member
 
Iscritto dal: Feb 2012
Messaggi: 36
Ciao Oceans, comunque poi ho risolto in questo modo:

questa è la parte del client

Codice:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>


#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define PROTOPORT  5193  /* default port number */

extern  int  errno;
char localhost[] = "127.0.0.1"; /* default host name */

int main(int argc, char *argv[]) {
  struct  sockaddr_in sad; /* structure to hold an IP address     */
  int     sd;              /* socket descriptor                   */
  int     port;            /* protocol port number                */
  int     n;               /* number of characters read           */
  char    buf[1000];       /* buffer for storing data from the server     */
  char    *host;	
  int     status = 1;       /*status = write*/
  int j = 0;
  char    *messaggio_finale = "IL CLIENT SI E DISCONNESSO";

  memset((char *)&sad,0,sizeof(sad)); /* clear sockaddr structure   */
  sad.sin_family = AF_INET;         /* set family to Internet       */
  
  if (argc > 2) {                   /* if protocol port specified   */
    port = atoi(argv[2]);           /* convert to binary            */
  } else {
    port = PROTOPORT;               /* use default port number      */
  }
  if (port > 0)                     /* test for legal value         */
    sad.sin_port = htons((u_short)port);
  else {                            /* print error message and exit */
    fprintf(stderr,"bad port number %s\n",argv[2]);
    exit(1);
  }

  /* Check host argument and assign host name. */
  if (argc > 1) {
    host = argv[1];    /* if host argument specified   */
  } else {
    host = localhost;
  }

  sad.sin_addr.s_addr = inet_addr(host);
  
  /* Create a socket. */
  sd = socket(PF_INET, SOCK_STREAM, 0);
  if (sd < 0) {
    fprintf(stderr, "socket creation failed\n");
    exit(1);
  }	  
 
  if (connect(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {
    fprintf(stderr, "connect failed\n");
    exit(1);
  }

  while(status != 0) {

  switch(status) {
    case 1:
      printf("(CLIENT) Scrivi il messaggio (premi q per terminare): ");
      fgets(buf,999, stdin); /*legge una linea dallo standard output*/
      if(buf[j] == 'q') {
        n = write(sd, messaggio_finale, strlen(messaggio_finale)+1);
        close(sd);
        exit(0);
      }
      n = write(sd, buf, sizeof(buf));
     
      status = 2;
      break;
    case 2:
      n = read(sd, buf, sizeof(buf));

      
      printf("(CLIENT) Ecco il messaggio ricevuto dal server: %s\n", buf);
      status = 1;
      break;
    }}
  close(sd);
  /* Terminate the client program gracefully. */
  exit(0);
}

e per quanto riguarda il server:


Codice:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define PROTOPORT   5193 /* default protocol port number */
#define QLEN        6    /* size of request queue        */



int main(int argc, char *argv[]) {
  struct  sockaddr_in sad; /* s. to hold server's address  */
  struct  sockaddr_in cad; /* s. to hold client's address  */
  int     sd, sd2;         /* socket descriptors */
  int     port; 	       /* protocol port number */
  int     alen;      	   /* length of address  */
  char    buf[1000];       /* buffer for sending data */
  int     n;
  int     status = 2;
  int     j = 0;
  char    *messaggio_finale = "IL SERVER SI E DISCONNESSO";    
	
  memset((char *)&sad, 0, sizeof(sad)); 	/* clear sockaddr s. */
  sad.sin_family = AF_INET;  		        /* set family to Internet */
  sad.sin_addr.s_addr = htonl(INADDR_ANY);	/* set the local IP addr  */
  
  if (argc > 1) { 		                    /* if argument specified        */
     port = atoi(argv[1]);   		        /* convert argument to binary   */
   } else {
     port = PROTOPORT;       		        /* use default port number      */
   }

   /* Verify port number */
   /* … */

  sad.sin_port = htons((u_short)port);
   
  /* Create a socket */
  sd = socket(PF_INET, SOCK_STREAM, 0);
  
  if (sd < 0) {
	 fprintf(stderr, "socket creation failed\n");
	 exit(1);
  }
  /* Bind a local address to the socket */
  if (bind(sd, (struct sockaddr *)&sad, sizeof(sad)) < 0) {
     fprintf(stderr,"bind failed\n");
     exit(1);
  }
  /* Specify the size of the request queue */
  if (listen(sd, QLEN) < 0) {
     fprintf(stderr,"listen failed\n");
     exit(1);
  }
  while((sd2 = accept(sd, (struct sockaddr *)&cad, &alen)) > -1) {
    while(status != 0) {
    switch(status) {
      case 1:
        printf("(SERVER) Scrivi il messaggio (premi q per terminare): ");
        fgets(buf, 999, stdin); 
        if(buf[j] == 'q') {
          n = write(sd2, messaggio_finale, strlen(messaggio_finale)+1);
          close(sd2);
          exit(0);
        }
        n = write(sd2, buf, sizeof(buf));
       status = 2;
        break;
      case 2 :
        n = read(sd2, buf, sizeof(buf));

   printf("(SERVER) Ecco il messaggio ricevuto dal client: %s\n", buf);
    status = 1;
    break;
  }}
  close (sd2);
   }}
moskino85 è offline   Rispondi citando il messaggio o parte di esso
Old 16-10-2013, 12:41   #6
moskino85
Member
 
Iscritto dal: Feb 2012
Messaggi: 36
Oceans11 scusami se ti disturbo nuovamente, ma dovrei fare lo stesso esercizio in java, l'unico problema che sto riscontrando e come utilizzare gli interi,il prof ha detto di utilizzare DataOutputStream e DataInputStream ma non riesco a farlo...hai qualche esempio a riguardo così da potermi rendere conto di come si utilizza?grazie ancora.
moskino85 è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Renault Twingo E-Tech Electric: che prezzo! Renault Twingo E-Tech Electric: che prezzo!
Il cuore digitale di F1 a Biggin Hill: l'infrastruttura Lenovo dietro la produzione media Il cuore digitale di F1 a Biggin Hill: l'infrast...
DJI Osmo Mobile 8: lo stabilizzatore per smartphone con tracking multiplo e asta telescopica DJI Osmo Mobile 8: lo stabilizzatore per smartph...
Recensione Pura 80 Pro: HUAWEI torna a stupire con foto spettacolari e ricarica superveloce Recensione Pura 80 Pro: HUAWEI torna a stupire c...
Opera Neon: il browser AI agentico di nuova generazione Opera Neon: il browser AI agentico di nuova gene...
Snap e Perplexity unite: dal prossimo an...
La Cina dice addio a NVIDIA? Il governo ...
Microlino, simbolo italiano della mobili...
Apple disattiverà la sincronizzaz...
Google lancia l'allarme: attenzione ai m...
Primo test drive con Leapmotor B10: le c...
'Non può essere un robot': l'uman...
Monopattino elettrico Segway Ninebot Max...
Syberia Remastered è disponibile:...
Sony scopre che tutti i modelli AI hanno...
Amazon nasconde un -15% su 'Seconda Mano...
Due occasioni Apple su Amazon: iPhone 16...
Verso la fine della TV tradizionale? I g...
Cassa JBL a 39€, portatili, smartphone, ...
Cometa interstellare 3I/ATLAS: la sonda ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 22:11.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v