Progettare un client in c

  • Autore discussione Autore discussione ccs
  • Data d'inizio Data d'inizio
Pubblicità
ccs ha detto:
tramite la shell entro a scuola e programmo kn il mio account!


ah ecco, quindi programmi da remoto, ottima idea :)

EDIT: Se hai problemi con quella parte di codice dimmelo ;)
 
si ma io ti ho detto ke quello devo usare il canone di codice ke ho fatto io e km ho fatto dovrebbe andare!! Ma forse ho caricato male le var!!
 
Ah, ho capito, per l'errore della riga 46:

tu richiedi il contenuto di un cast di un puntatore

puoi risolvere così

Ti crei una variabile di tipo: struct in_addr supportoIndirizzo;

fai una memcpy(&supportoIndirizzo,host->h_addr,sizeof(struct in_addr));

poi fai

inet_addr(inet_ntoa(supportoIndirizzo));

si ma come dicevi tu nn mi torna!! Nn lo capisco forse xkè uso delle cose standar!! Ma nn abbiam mai fatto ks nn vorrei ke nn lo accettasse il prof xkè nell'esame di ammissione devo modificare il codice di questo prog km da rikiesta ke dirà e controlla il codice in diretta!
 
Capisco, allora l'unica soluzione è di andare dal professore e dirgli che la funzione che ha inserito lui, con il compilatore che usi non va, segnati anche l'errore che ti viene riportato dal compilatore.

E' la cosa più giusta da fare :)

Ciao!
 
Allora prova a ricontrollare i file ".h" che hai incluso, probabilmente ne hai dimenticato uno ;)

Ciao! :)
 
re

Esattamente come avevi detto mancava una include! :)

#include <netdb.h>

ora sono alle prese con

/* Punto 5.*/
len = strlen(argv[3]);
write(sd, &len, sizeof(int));
N_value = value;
printf("value = %s\n", N_value);
N = strlen(msg); //mi da errore qui!!

dove devo scrivere un intero C di 4 bytes (header) indicando qti caratteri N spedirà in futuro. N=strlen(messaggio), usando la typedef union.
 
ccs ha detto:
Esattamente come avevi detto mancava una include! :)

#include <netdb.h>

ora sono alle prese con

/* Punto 5.*/
len = strlen(argv[3]);
write(sd, &len, sizeof(int));
N_value = value;
printf("value = %s\n", N_value);
N = strlen(msg); //mi da errore qui!!

dove devo scrivere un intero C di 4 bytes (header) indicando qti caratteri N spedirà in futuro. N=strlen(messaggio), usando la typedef union.


Scusa ma non ti ho capito :)

N_value = value;

Dove hai inizializzato 'value'?

N = strlen(msg); //mi da errore qui!!

N è un char non un int e poi msg non è inizializzato con nessun valore.

Ciao!

:)
 
re

Io qui stò cercando di fare la union ma nn sn molto brava a farla e poi ora mi pare di capire rielggendo la consegna ke devo scrivere il num dei caratteri presenti nell'user e penso di averlo sbagliato di brutto!! Oddio!! asp ke ti linco il testo della consegna ks ci guardi e mi dici se ho fatto una cavolata immane!

Ecco di seguito il link!
http://www3.csr.unibo.it/~maniezzo/didattica/reti/protocollo_client.pdf
 
re

Io N l'ho dichiarato char ma mi da ancora errore! :cav: :muro:
Oddio!! Come mai?

Guarda ora il codice:

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>

#define SOCKET_ERROR ((int)-1)

char A[10];
char B[100];
char user[50] = "Alessandra,Raffoni,0000240469";
char buf[100];
char msg[120];
int port, len, nread, nwrite, n, sd, i, value;
char h, N_value, N;
char* servizio;
typedef union {
int value;
char N_value[4];
} byte_msg;
int main(int argc, char **argv) {
struct hostent* host;
struct sockaddr_in cliaddr, servaddr;
byte_msg N;
char ris[3];
if (argc != 4) {
printf("Error: %s serverAddress serverPort message\n", argv[0]);
exit(1);
}
else {
memset((char *)&servaddr, 0, sizeof(struct sockaddr_in));
servaddr.sin_family = AF_INET;
host = (struct hostent *)gethostbyname(argv[1]);
if (host == NULL) {
printf("%s not found in /etc/host\n", argv[1]);
exit(1);
}
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons((u_short)atoi(argv[2]));
servaddr.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr*)host->h_addr)));
sd = socket(AF_INET, SOCK_STREAM, 0);

/* Punto 2. */
if (sd < 0) {
perror("apertura socket");
exit(1);
}
printf("Client: creata la socket sd=%d\n", sd);
if (connect(sd, (struct sockaddr *)&servaddr, sizeof(struct sockaddr)) < 0) {
perror("connect");
exit(-1);
}
printf("Client: connect ok\n");

/* Punto 3.*/
len = 10;
nread = 0;
while ((len > nread) && ((n = read(sd, &(buf[nread]), len - nread)) > 0)) {
nread += n;
printf("readeffettuata, risultato n=%d len=%d nread=%d len-nread=%d\n", n, len, nread, len-nread);
fflush(stdout);}

/* Punto 4.*/
strcat(A, user);
len = strlen(A);
strcpy(B, A);
len = strlen(B);
for (i = len; i < 100; i++) {
B = ' ';}
len = strlen(argv[3]) + 1;
nwrite = 0;
while ((n = write(sd, &(msg[nwrite]), len - nwrite)) > 0)
nwrite += n;
strcpy(msg,argv[3]);

/* Punto 5.*/
byte_msg header;
len = strlen(argv[3]);write(sd, &len, sizeof(int));
N_value = value;
printf("value = %s\n", N_value);
N = strlen(msg);

/* Punto 6. */
len = strlen(msg) + 1;
nwrite = 0;
while ((n = write(sd, &(msg[nwrite]), len - nwrite)) > 0)
nwrite += n;

/* Punto 7. */
while ((len>nread) && ((n = read(sd, &(buf[nread]), len - nread)) > 0)) {
nread += n;printf("readeffettuata, risultato n=%d len=%d nread=%d len-nread=%d\n", n, len, nread, len - nread);
fflush(stdout);}
ris[2] = '\0';

/* Punto 8. */
printf("Risultato dal server: ");
printf("%s\n",ris);

/* Punto 9. */
close(sd);
exit(0);
return(0);
}
} //main
 
ccs ha detto:
Io N l'ho dichiarato char ma mi da ancora errore! :cav: :muro:
Oddio!! Come mai?

Guarda ora il codice:


Ed in fatti è perchè l'hai dichiarato char ti da l'errore, la strlen restituisce un int :)

La variabile msg non è stata inizializzata, sei sicura di non aver sbagliato dal copia/incolla fatto dai lucidi del prof? :)

Da quanto ho capito dopo aver letto la traccia, tu devi spedire prima il numero dei byte che spedirai (in pratica la strlen del messaggio) e poi dovrai inviare il messaggio (punto 6)

Ciao!

Aspetta :)

Ho visto che la variabile N l'hai dichiarata come char nelle variabili globali.
e poi come Union all'interno del main. così tu nascondi la N dichiarata char. Dovresti eliminarla (la N char) :D

Per scrivere/leggere in una union devi usare la sintassi <nomeVariabile>.<nomeCampoInterno> in wuesto caso:

N.value (per l'intero) e N.N_value (per i char).

Ciao!
 
Pubblicità
Pubblicità
Indietro
Top