Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    99

    Lettura di interi su una stringa

    Ciao, ho questo tipo di problema: sto scrivendo un client ed un server, il client riceve da stdin una serie di numeri fino a che non riceve CTRL-D e deve inviare tali numeri in una stringa al server, il server deve leggere tutti questi numeri sulla stringa e deve farne la somma, potreste aiutarmi solo per quanto riguarda la parte di IO?? cioè lettura da parte del server dei numeri sulla stringa.

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Linguaggio?

    Sistema operativo?

    Hai scritto il client?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    99
    Scusami tanto il linguaggio è il C, sisi ho scritto sia client che server, ho questo problema solo di creare una stringa di numeri ed inviarla al server per fargliela elaborare.

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Hai scritto sia il client sia il server e non sai formare una stringa?

    Mostra il codice del client in cui prelevi i dati da stdin ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Utente di HTML.it
    Registrato dal
    Feb 2006
    Messaggi
    99
    Si purtroppo è da un po che non uso IO con C e sto avendo qualche problemino , le cose + semplici di solito non mi vengono

    #include "basic.h"

    int MAX(int,int);

    int MAX(int uno, int due){

    if(uno > due)
    return uno;
    return due;
    }

    void client_somma(FILE *fp, int sockfd) {
    int maxfdl;
    fd_set rset;
    char sendline[MAXLINE], sendline2[MAXLINE], recvline[MAXLINE];
    int n;
    char * str = (char*) malloc(MAXLINE);

    FD_ZERO(&rset);
    for( ; ; ) {

    FD_SET(fileno(fp), &rset);
    FD_SET(sockfd, &rset);
    maxfdl = MAX(fileno(fp), sockfd) + 1;
    if( select(maxfdl, &rset, NULL, NULL, NULL) < 0 )
    err_sys("select error");

    if( FD_ISSET(sockfd, &rset) ) {
    if ( (n = reti_readline(sockfd, recvline, MAXLINE)) < 0) {
    if( errno == EPIPE ) {
    printf("str_cli: server terminated prematurely\n");
    break;
    }
    else {
    printf("errore %d\n", errno);
    err_sys("readline error");
    }
    }
    if (n == 0)
    err_quit("str_cli: server terminated prematurely");

    fputs(recvline, stdout);
    }

    if( FD_ISSET(fileno(fp), &rset) ) {
    bzero(str, strlen(str));
    /* if( fgets(sendline, MAXLINE, fp) == NULL)
    return;
    if( fgets(sendline2, MAXLINE, fp) == NULL)
    return;*/
    scanf("%s",&sendline);
    scanf("%s",&sendline2);
    strncat(str,sendline, strlen(sendline));
    strncat(str," ", 1);
    strncat(str,sendline2, strlen(sendline2));
    strncat(str, "\n", 1);
    if( (reti_writen(sockfd, str, strlen(str))) < 0)
    err_sys("write error");
    }
    }
    }

    int main(int argc, char **argv) {
    int sockfd, n;
    struct sockaddr_in servaddr;

    if (argc != 2)
    err_quit("usage: client <IPaddress>");
    if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
    err_sys("socket error");

    bzero(&servaddr, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_port = htons(PORT); /* echo server con select */
    if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
    err_quit("inet_pton error for %s", argv[1]);

    if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
    err_sys("connect error");

    client_somma(stdin, sockfd); /* svolge tutto il lavoro del client */

    exit(0);
    }
    Viene utilizzata la select nel client per gestire sia l'input da stdin che l'arrivo di dati sul socket connesso al server. La parte che mi riguarda la devo inserire dopo if( FD_ISSET(fileno(fp), &rset) ) cioè dove gestisco l'input da stdin

  6. #6
    codice:
    #include "basic.h"
    
    #define MAX(uno, due) ((uno) > (due))
    
    void client_somma(FILE *fp, int sockfd) {
    
    	int maxfdl;
    	fd_set rset;
       char sendline[MAXLINE], sendline2[MAXLINE], recvline[MAXLINE];
       int n;
       char * str = (char*) malloc(MAXLINE);
    
       FD_ZERO(&rset);
       
       for( ; ; ) {
    
          FD_SET(fileno(fp), &rset);
          FD_SET(sockfd, &rset);
    
          maxfdl = MAX(fileno(fp), sockfd) + 1;
       
          if( select(maxfdl, &rset, NULL, NULL, NULL) < 0 )
             err_sys("select error");
    
          if( FD_ISSET(sockfd, &rset) ) {
             if ( (n = reti_readline(sockfd, recvline, MAXLINE)) < 0) {
                if( errno == EPIPE ) {
    
                   printf("str_cli: server terminated prematurely\n");
                   break;
    
                }
                else {
    
                   printf("errore %d\n", errno);
                   err_sys("readline error");
                }
             }
             if (n == 0)
                err_quit("str_cli: server terminated prematurely");
    
             fputs(recvline, stdout);
    
          }
    
          if( FD_ISSET(fileno(fp), &rset) ) {
    
             bzero(str, strlen(str));
    /* if( fgets(sendline, MAXLINE, fp) == NULL)
          return;
    
       if( fgets(sendline2, MAXLINE, fp) == NULL)
          return;*/
    
             scanf("%s",&sendline);
             scanf("%s",&sendline2);
             strncat(str,sendline, strlen(sendline));
             strncat(str," ", 1);
             strncat(str,sendline2, strlen(sendline2));
             strncat(str, "\n", 1);
    
             if( (reti_writen(sockfd, str, strlen(str))) < 0)
    
                err_sys("write error");
    
          }
    	}
    }
    
    int main(int argc, char **argv) {
    
       int sockfd, n;
       struct sockaddr_in servaddr;
    
       if (argc != 2)
          err_quit("usage: client <IPaddress>");
    
       if ( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
          err_sys("socket error");
    
       bzero(&servaddr, sizeof(servaddr));
       
       servaddr.sin_family = AF_INET;
       servaddr.sin_port = htons(PORT); /* echo server con select */
       
       if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
          err_quit("inet_pton error for %s", argv[1]);
    
       if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
          err_sys("connect error");
    
       client_somma(stdin, sockfd); /* svolge tutto il lavoro del client */
    
       exit(0);
    
    }
    Pulito ed indentato.

  7. #7
    Qualche correzione:
    codice:
    #include "basic.h"
    
    #define MAX(uno, due) ((uno) > (due))
    
    void client_somma(FILE *fp, int sockfd) {
    
       int maxfdl;
       fd_set rset;
    
       char sendline[MAXLINE];
       char sendline2[MAXLINE];
       char recvline[MAXLINE];
    
       int n;
       char *str = (char*) malloc(MAXLINE);
    
       assert(str != NULL);
    
       FD_ZERO(&rset);
       
       for(;;) {
    
          FD_SET(fileno(fp), &rset);
          FD_SET(sockfd, &rset);
    
          maxfdl = MAX(fileno(fp), sockfd) + 1;
       
          if( select(maxfdl, &rset, NULL, NULL, NULL) < 0 )
             err_sys("select error");
    
          if( FD_ISSET(sockfd, &rset) ) {
             if ( (n = reti_readline(sockfd, recvline, MAXLINE)) < 0) {
                perror("reti_readline");
             }
             if (n == 0)
                err_quit("str_cli: server terminated prematurely");
    
             fputs(recvline, stdout);
    
          }
    
          if( FD_ISSET(fileno(fp), &rset) ) {
    
             bzero(str, MAXLINE);
    /* if( fgets(sendline, MAXLINE, fp) == NULL)
          return;
    
       if( fgets(sendline2, MAXLINE, fp) == NULL)
          return;*/
    
             scanf("%s", sendline);
             scanf("%s", sendline2);
    
    /*Errore di buffer overflow*/
             strncat(str, sendline, strlen(sendline));
             strncat(str," ", 1);
             strncat(str,sendline2, strlen(sendline2));
             strncat(str, "\n", 1);
    
    
             if( (reti_writen(sockfd, str, strlen(str))) < 0)
    
                err_sys("write error");
    
          }
    	}
    }
    
    int main(int argc, char **argv) {
    
       int sockfd, n;
       struct sockaddr_in servaddr;
    
       if (argc != 2)
          err_quit("usage: client <IPaddress>");
    
       if ( (sockfd = socket(AF_INET, SOCK_STREAM, IPROTO_TCP)) < 0)
          err_sys("socket error");
    
       bzero(&servaddr, sizeof(servaddr));
       
       servaddr.sin_family = AF_INET;
       servaddr.sin_port = htons(PORT); /* echo server con select */
       
       if (inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0)
          err_quit("inet_pton error for %s", argv[1]);
    
       if (connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr)) < 0)
          err_sys("connect error");
    
       client_somma(stdin, sockfd); /* svolge tutto il lavoro del client */
    
       exit(0);
    
    }
    Ci sono molti errori.

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 © 2025 vBulletin Solutions, Inc. All rights reserved.