PDA

Visualizza la versione completa : [C] Lettura di interi su una stringa


doping
08-12-2008, 22:29
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.

oregon
08-12-2008, 22:38
Linguaggio?

Sistema operativo?

Hai scritto il client?

doping
08-12-2008, 22:56
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.

oregon
08-12-2008, 23:06
Hai scritto sia il client sia il server e non sai formare una stringa? :confused:

Mostra il codice del client in cui prelevi i dati da stdin ...

doping
08-12-2008, 23:50
Si purtroppo č da un po che non uso IO con C e sto avendo qualche problemino :D:D, le cose + semplici di solito non mi vengono :mame:



#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 :D

menphisx
09-12-2008, 16:59
#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.

menphisx
09-12-2008, 17:19
Qualche correzione:


#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.

Loading