Progettare un client in c

ccs

Utente Attivo
27
0
Ho fatto un client in c in ssh kn il seguente 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 <errno.h>
#define SOCKET_ERROR ((int)-1)
char A[10];
char B[100];
char user[] = "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;
/* Punto 5.*/
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(ris);
/* Punto 9. */
close(sd);
exit(0);
return(0);
}
} //main

ma mi da i seguenti errori che non dovrebbe darmi:

progClient.c:46: error: dereferencing pointer to incomplete type
progClient.c:90: error: incompatible types in assignment


Se qualcuno mi sa aiutare gli sarò infinitamente grato!!

Grazie a tutti!
 

Arcovoltaico77

Utente Èlite
1,558
10
CPU
Core 2 Duo E2200 + Thermaltake silent tower 112cu (1,3 Kg)
Scheda Madre
Asus P5B
HDD
160Gb Maxtor SATA2 + WD Caviar 250GB SATA2
RAM
2 * 1Gb Corsair CL4 (Pc4300, Value Select)
GPU
Point of View 6600GT 256Mb (500-1000 @ 571-1183)
Audio
integrato 5.1
Monitor
LCD 17 samsung
PSU
Enermax Pro82+ 525 Watt
Case
ColorsIT
OS
Windows XP & Ubuntu
benvenuto sul forum, intanto...

se riesci a postare le righe di codice che ti danno errore è meglio...

e se riesci anche ad editare il primo post ed indentare il codice ci eviti questo effetto :shock: eheh :asd:

grassie!:)
 

shade81

Nuovo Utente
20
0
progClient.c:46: error: dereferencing pointer to incomplete type :boh:
Non vorrei dire cavolate ma l'errore mi sembra che ti viene perchè hai dimenticato di fare la malloc e nn risulta deferenziato alcun puntatore.. io nn ho tempo di testare il codice però se nn ricordo male prova a sostituire a quella riga queste e prova a vedere se funzionano, forse una volta inserite dovrai risistemare un po il codice.. cmq prova..
host_addr = (char*) malloc(sizeof(char*)*16);
addr = inet_addr(host_addr);
servaddr.sin_addr.s_addr = addr;
Ricordati di dichiarare host_addr come puntatore a carattere (char *host_addr) e addr come unsigned int (unsigned int addr). CQM spero davvero di nn aver detto una cazz... eheheh


progClient.c:90: error: incompatible types in assignment :cav:
Questo errore invece è abbastanza semplice te lo da xkè assegni ad una variabile N di tipo char un valore intero restituito dalla funzione strlen.. forse volevi usare n piccola che è di tipo int e ti sei sbagliata.. cmq basta sostituire N grande con una variabile int e risolvi..

 

ccs

Utente Attivo
27
0
Ciao! Grazie dell'aiuto e del benvenuto!

La linea 46 il prof ci aveva detto di farla così come ho fatto io xkè era standar e la linea 90 ho corretto km dicevi ma mi da lo stesso errore!!

Oddio!! :skept: :(
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
Ciao, probabilmente non ci troviamo con i numeri delle righe (infatti sono stati eliminati tutte le righe vuote): ecco cosa ho trovato di strano:

ris[2] = '\0';

/* Punto 8. */
printf("Risultato dal server: ");
printf(ris);

1) ris non era stata inizializzata con un valore e cerchi di stamparla;
2) per stampare ris devi usare printf("%s\n",ris);



in questo punto:

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

vuoi inviare msg, ma al suo interno non hai scritto nulla, probabilmente prima dovevi fare una strcpy(msg,argv[3]);

Al momento non ho un compilatore, ad occhio ho visto questo che non mi convince.

Ciao!


EDIT:

Se non ricordo male, l'inizializzazione:

char user[] = "Alessandra,Raffoni,0000240469";

crea un array di char di N caratteri (se non ho contato male 29 +1) ma non lo inizializza con il valore dato. dovresti scrivere:

char user[50] = "Alessandra,Raffoni,0000240469";

questo tipo di inizializzazione non la uso da MOLTO tempo, ma ho questa vaga sensazione.

Ciao!
 

ccs

Utente Attivo
27
0
Specificazione degli errori

Specifico meglio gli errori ks ci capiano!

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

servaddr.sin_addr.s_addr = inet_addr(inet_ntoa(*((struct in_addr*)host->h_addr))


progClient.c:90: error: incompatible types in assignment

N = strlen(msg);
 

shade81

Nuovo Utente
20
0
L'errore della linea 90 mi sembra proprio quello a meno che abbia contato male le righe cmq la riga mi sembra questa
N = strlen(msg); ed N e dichiarata come char h, N_value, N;

X l'altro errore visto che cmq il tuo prof lo fa standard cosi ti consiglio di vedere bene i suoi esempi forse ti sei scordata qualke parte.. con i puntatori è un attimo sbagliare...
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
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));


Dovrebbe andare.

Ciao!

EDIT: comunque gli errori che ti ho segnalato prima rimangono lo stesso ;)

Ciao!
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
ccs ha detto:
No nn ti ho capito! Nn mi torna cn le cose dei lucidi ke ho! guarda sul sito
http://www.cs.unibo.it/~roffilli/csr.html


Alcuni compilatori segnalano quell'errore, altri no :)

quello che hai scritto in teoria è corretto, il mio post è un workAround al problema ;)

Ciao! :)

EDIT: quale di quei lucidi? :)

Ciao!
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
ccs ha detto:
A ok! è ke il prof a lez in lab nn ci ha spiegato quasi nulla!!

i lucidi sn questi:
Lab 4: 03/4 [PDF]
Lab 5: 17/4 [PDF] [ELF-server]
Lab 6: 23/4 [PDF]
Lab 7: 07/5 [PDF]

quello ke è nei lucidi è l'unica cosa ke ci ha detto!


Si, ho visto :)

probabilmente il compilatore che usi tu è diverso da quello del professore, sarà più nuovo.

Comunque Prova ;)

Ciao!
 

ccs

Utente Attivo
27
0
re

noi possiamo usare km shell ssh o putty e x programmare vi o vim.
Io uso ssh e vim
 

K.I.

Utente Èlite
1,644
7
CPU
Intel Prescott 530J con Zalman 7700CU
Scheda Madre
Asus P5GD2
HDD
Maxtor Sata 160Gb e Floppy
RAM
Micron 1024Mb
GPU
Asus 6600GT PCI-E
Audio
Onboard con Creative GD580
Monitor
HP F2105 e Scheda TV Terratec Cinergy 600TV
PSU
Enermax Noisetaker 485W
OS
Windowd XP e Kubuntu 7.04
ccs ha detto:
noi possiamo usare km shell ssh o putty e x programmare vi o vim.
Io uso ssh e vim

Quelli sono appunto i programmi per la shell e l'editor di testo, il compilatore è quello che richiami quando fai il make :D

Quindi questo codice lo puoi compilare solo all'università o hai linux anche a casa?

Ciao! :)
 

Ci sono discussioni simili a riguardo, dai un'occhiata!

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili