Progettare un client in c

  • Autore discussione Autore discussione ccs
  • Data d'inizio Data d'inizio
Pubblicità
re

Ciao! Il fatto è ke nn sapevo fare a far mandare il messaggio. Come lo devo dikiarare?
Ora mi da errore qui!

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


Mi spiegheresti come far andare il messaggio? Grazie ancora sei fantastico!
 
Allora,

rileggendo un'altra volta il testo del prof, ho visto che nel punto 3 legge una stringa di 10 caratteri A. Poi devi copiare A in B e poi ci devi aggiungere i tuoi dati.

Nel punto 3 tu leggi il valore passato dal server e lo memorizzi in buf (che invece dovrebbe essere A.

dopo aver letto A, scrivi il terminatore: A[10] = '\0';

Nel punto 4 copi prima user in A: attenzione, superi la dimensione di A!!!!
devi fare la strcpy di A in B (e questo lo fai), poi devi fare una strcat di user in B.

Ti ricordo che A e B li dichiari di 10 e 100 caratteri, ma nelle stringhe c'è anche il carattere terminatore '\0' quindi devono essere di 11 e 101 caratteri ;)


Sempre nel punto 4 fai le operazioni:

len = strlen(argv[3]) + 1;
nwrite = 0;
while ((n = write(sd, &(msg[nwrite]), len - nwrite)) > 0)
nwrite += n;
strcpy(msg,argv[3]);

Ma tu devi spedire B!!!! non msg!!! e cosa centra in questo caso argv[3]?, lo drai inviare dopo!!!

tu devi calcolarti la lunghezza di B (strlen) e poi dei fare la write di B ;)

la strcpy "strcpy(msg,argv[3]);" in questo caso non ti serve a nulla!

dopo il ciclo, devi metterci il terminatore : B[100] = '\0';

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);

ti sei ridichiarata una variabile di tipo byte_msg. ok, usiamo questa, ma a questo punto cancelliamo le altre 2 variabili 'N' :)

ti ricordi come si accede alle union? devi fare header.value = strlen(argv[3]);

e poi fare la write di heared.N_value e passare come dimensione alla write il numero 4 (terzo parametro della write)

Punto 6:


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

Che centra msg? devi inviare argv[3] e len deve essere la strlen di argv[3] senza il +1.


/* 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';

Perchè leggi su buf? devi leggere su ris ;)

Ti sei dimenticata di inizializzare nread ;)


Al momento non vedo altri errori, logicamente ora devi scriverlo tu il codice ;) Farlo è compito tuo, non vorrei scrivertelo io, altrimenti, cosa impari? :)


Dopo che lo avrai corretto, vediamo se va bene, ma mi raccomando, se hai dei dubbi chiedi, perchè se poi il professore ti chiede perchè hai usato una determinata funzione e tu non sa rispondere, il tuo lavoro sarà vanificato.

Ciao! :)
 
re

Ciao!
:inchino: ancora se disturbo!! Grazie a tè stò finalmente imparando grazie!! Sei fantastico!!
Ho dei dubbi!

Nn capisco km fare la cosa ke dici nel punto 3.

Come faccio nel 4 a inviare dopo argv[3]?

tu devi calcolarti la lunghezza di B (strlen) e poi dei fare la write di B
Ma nn ho fatto ks?

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


a mi ero sbagliata nel punto 5 a scrivere
byte_msg header;
doveva essere N invece di header.

Va bn così ora il punto 5 e il 6?

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

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

tu dici:
Ti sei dimenticata di inizializzare nread
Ma come va fatto? Io pensavo bastasse dichiararlo!

Ecco in fine come risulta il tutto senso quello ke kiedo sopra!

#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 <errno.h>
#define SOCKET_ERROR ((int)-1)
char A[11];
char B[101];
char user[] = "Alessandra,Raffoni,0000240469";
char buf[100];
char msg[100];
int port, len, nread, nwrite, n, sd, i, N.value;
char h;
char* servizio;
typedef union {
int value;
char p_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/hosts\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);
/* Punto 4.*/
strcat(A, user);
len = strlen(A);
strcpy(B, A);
strcat(B,user);
len = strlen(B);
for (i = len; i < 11; i++) {
B = ' ';}len = strlen(argv[3]) + 1;
nwrite = 0;
while ((n = write(sd, &(msg[nwrite]), len - nwrite)) > 0)
nwrite += n;
B[100] = '\0';
/* Punto 5.*/
byte_msg N;len = strlen(argv[3]);write(sd, &len, sizeof(int));
N.value = strlen(argv[3]);
write(sd, N.value, sizeof(4);
N.value = value;
printf("value = %s\n", N.value);
N = strlen(msg);
/* Punto 6. */
len = strlen(argv[3]);
nwrite = 0;
while ((n = write(sd, &(argv[3][nwrite]), len - nwrite)) > 0)
nwrite += n;
/* Punto 7. */
while ((len>nread) && ((n = read(sd, &(ris[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(ris);
/* Punto 9. */
close(sd);exit(0);return(0);}
} //main


Grazie ancora!! Sei un tesoro!! Prenditi pure la mia mail (anke contatto di msn) ks mi sdebito!!
 
ccs ha detto:
Ciao!
:inchino: ancora se disturbo!! Grazie a tè stò finalmente imparando grazie!! Sei fantastico!!
Ho dei dubbi!

Nn capisco km fare la cosa ke dici nel punto 3.

Come faccio nel 4 a inviare dopo argv[3]?


Ma nn ho fatto ks?



a mi ero sbagliata nel punto 5 a scrivere

doveva essere N invece di header.

Va bn così ora il punto 5 e il 6?



tu dici:

Ma come va fatto? Io pensavo bastasse dichiararlo!

Ecco in fine come risulta il tutto senso quello ke kiedo sopra!



Grazie ancora!! Sei un tesoro!! Prenditi pure la mia mail (anke contatto di msn) ks mi sdebito!!



Grazie :), ma mica lo faccio per avere la tua e-mail, lo faccio perchè mi fa piacere aiutarti ;)

Allora, rivediamo il codice ;)

Il punto 3 e' questo:
Nota che ho messo la A al posto di buf, perchè è la A che devi leggere ;)

Codice:
/* Punto 3.*/
len = 10;
nread = 0;
while ((len > nread) && ((n = read(sd, &(A[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);
}
A[10] = '\0';


Punto 4:

Si copia A in B, poi concateni a B la viabile user, poi fai il ciclo for per aggiungere gli spazi e alla fine del ciclo for ci metti il terminatore e poi invii B
Nel ciclo for andava 100, non 11 ;) in quento devi scorrere la lunghezza di B :)

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

Punto 5:
La viabile N l'hai già dichiarata su, è inutile ridichiararla. poi prendi la lunghezza di argv[3] e la immetti nella union (valore intero) e poi la invii con la write tramite il campo char.

Codice:
/* Punto 5.*/
N.value = strlen(argv[3]);
write(sd, N.N_value, 4);
printf("value = %d\n", N.value);


Punto 6 ok ;)

Punto 7:
Ho insrito l'inizializzazione di nread a 0 in qunto l'hai già usata, quindi se non è uguale a zero ti può creare problemi ;)

Codice:
/* Punto 7. */
nread = 0
while ((len>nread) && ((n = read(sd, &(ris[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:
Avevi sbagliato la printf di ris.

Codice:
printf("Risultato dal server: ");
printf("%s\n", ris);


Prova a vedere ora se te lo compila.


Ciao! :)
 
re

Ciao!!
Ecco gli errori ke mi da ora!

progClient.c:17: error: expected '=', ',', ';', 'asm' or '__attribute__' before '.' token
progClient.c: In function 'main':
progClient.c:44: error: dereferencing pointer to incomplete type
progClient.c:88: error: 'byte_msg' has no member named 'N_value'
progClient.c:90: error: incompatible types in assignment
progClient.c:100: error: expected ';' before 'while'

Io ho corretto così:

#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 <errno.h>
#define SOCKET_ERROR ((int)-1)
char A[11];
char B[101];
char user[] = "Alessandra,Raffoni,0000240469";
char buf[100];
char msg[100];
int port, len, nread, nwrite, n, sd, i, N.value;
char h;
char* servizio;
typedef union {
int value;
char p_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/hosts\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, &(A[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);
}
A[10] = '\0';
/* Punto 4.*/
strcpy(B, A);
strcat(B,user);
len = strlen(B);
for (i = len; i < 100; i++) {
B = ' ';
}
B[100] = '\0';
len = strlen(B);
nwrite = 0;
while ((n = write(sd, &(B[nwrite]), len - nwrite)) > 0)
nwrite += n;
/* Punto 5.*/
byte_msg N;
len = strlen(argv[3]);
N.value = strlen(argv[3]);
write(sd, N.N_value, 4);
printf("value = %d\n", N.value);
N = strlen(msg);
/* Punto 6. */
len = strlen(argv[3]);
nwrite = 0;
while ((n = write(sd, &(argv[3][nwrite]), len - nwrite)) > 0)
nwrite += n;
/* Punto 7. */
nread = 0
while ((len>nread) && ((n = read(sd, &(ris[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


Booh! :boh: :inchino: forse ho corretto male!
Ma nel punto 5 nn devo inviare un messaggio?
Grazie dell'aiuto!!
 
per l'errore in riga 17, non puoi dichiarare cos' N.value, toglilo. Tanto lodichiari nella riga subito dopo /*Punto 5*/

Alla riga 88: hai modificato il campo della union in p_value, sostituisci N_value con p_value.


Errore riga 90: l'istruzione N = strlen(msg); non ti serve, eliminala


Errore riga 100: alla riga nread = 0 prima del punto 7, manca il punto e virgola.


Per l'errore del puntatore, ma non avevi già inserito l'header che ti mancava? lo hai tolto un'altra volta?
Ciao!
 
re

Scusa ma nn sapevo + se andava bn o meno l'header! Ora correggo gli altri e ti faccio sapere! grazie ancora e scusa il disturbo!!! Sai mi sento in colpa di romperti sempre!! Vorrei poter kiedere hai miei compagni di uni e nn rompere tè invece il mio ex nn me lo permette e ciò mi mette in disagio sempre xkè mi han messo in un angolo!! Grazie di tutto!!
 
re

Ecco come ho corretto:

#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 <errno.h>
#include <netdb.h>


#define SOCKET_ERROR ((int)-1)
char A[11];
char B[101];
char user[] = "Alessandra,Raffoni,0000240469";
char buf[100];
char msg[100];
int port, len, nread, nwrite, n, sd, i;
char h;
char* servizio;
typedef union {
int value;
char p_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/hosts\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, &(A[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);
}
A[10] = '\0';
/* Punto 4.*/
strcpy(B, A);
strcat(B,user);
len = strlen(B);
for (i = len; i < 100; i++) {
B = ' ';
}
B[100] = '\0';
len = strlen(B);
nwrite = 0;
while ((n = write(sd, &(B[nwrite]), len - nwrite)) > 0)
nwrite += n;
/* Punto 5.*/
byte_msg N;
len = strlen(argv[3]);
N.value = strlen(argv[3]);
write(sd, N.p_value, 4);
printf("value = %d\n", N.value);
/* Punto 6. */
len = strlen(argv[3]);
nwrite = 0;
while ((n = write(sd, &(argv[3][nwrite]), len - nwrite)) > 0)
nwrite += n;
/* Punto 7. */
nread = 0;
while ((len>nread) && ((n = read(sd, &(ris[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


e ecco gli errori:

progClient.c:44: error: dereferencing pointer to incomplete type

risolto questo errore!! Se ne era andato ancora #include <errno.h> e nn sò xkè!!

Ora lo eseguo con il server!
Grazie di cuore ancora x il prezzioso aiuto ke mi dai!!:)
 
re

Io ho cercato di caricare il server come mi avevan detto kn


ma nn va. dice ke nn lo trova come posso fare? Dove è ke sbaglio?
A poi x eseguire il server è vero ke devo aprire un altro ssh e poi far eseguire?

Grazie ancora!! :asd: :)
 
ccs ha detto:
Io ho cercato di caricare il server come mi avevan detto kn



ma nn va. dice ke nn lo trova come posso fare? Dove è ke sbaglio?
A poi x eseguire il server è vero ke devo aprire un altro ssh e poi far eseguire?

Grazie ancora!! :asd: :)


Si, devi aprire un altro ssh.

Il nome del server non lo so, hai visto nella traccia che ti ha dato il prof? Li non c'è?

Ciao!
 
Sicura che sia "serve.exe" e non "server.exe"

EDIT: tra l'altro in fondo alla tracia del prof la riga da eseguire è ./server (senza exe)

nel terminale ssh prova a scrivere ls e vedi se c'è un file che si chiama server.

Ciao!
 
re

A si si mi ero scordata la r!! :cav: :inchino: :inchino: :inchino:

Ho riprovato ma guarda:

STUDENTI\alessandra.raffoni@alfa:~/progClient$ ./server
-bash: ./server: No such file or directory
 
Pubblicità
Pubblicità
Indietro
Top