PDA

View Full Version : [C++/C] Problemi nell'uso delle Winsock


MrModd
18-11-2008, 20:22
Salve gente,
ho un problema che non riesco a risolvere...
sto usando su un programma fgetc() (della libreria standard del C) e send() (delle winsock).
C'è questo problema:
io dovrei prendere un carattere da un file con "variabile=fgetc(file);" e inviare il carattere attraverso "send(socket, variabile, 1,0)". Il problema è che sono due tipi di variabili differenti: fgetc() salva su una char, mentre send() vuole in ingresso una const char*.
Come fò?

Ho provato in questi modi:

send(socket, &((const char)variabile),1,0);
send(socket, &((const char*)variabile),1,0);
send(socket, ((const char*)variabile),1,0);
send(socket, variabile,1,0);

ma niente, davano errore.


Poi mi spieghereste cosa sono le variabili con puntatore e quando si usa l'asterisco e quando la & prima della variabile?

cionci
18-11-2008, 20:30
L'unica che non hai provato, cioè questa:

send(socket, &variabile , 1, 0);

Spiegarti cosa è l'operatore di dereference (&) è semplice, ottieni l'indirizzo della variabile alla sua destra.
Spiegarti invece l'operatore *, le variabili puntatore e i mille usi che se ne vuole fare credo che ti convenga leggerlo su un libro.

MrModd
18-11-2008, 20:56
L'unica che non hai provato, cioè questa:

send(socket, &variabile , 1, 0);

Spiegarti cosa è l'operatore di dereference (&) è semplice, ottieni l'indirizzo della variabile alla sua destra.
Spiegarti invece l'operatore *, le variabili puntatore e i mille usi che se ne vuole fare credo che ti convenga leggerlo su un libro.

e non funziona comunque...
Io ho questa struttura:

char variabile;
do
{
variabile=fgetc(file);
send(socket, &file,1,0);
fputs(&tmp, log);
}
while (variabile==10)

Ma non mi esce mai dal ciclo e il file log si riempie in pochi secondi di caratteri che non esistono in "file".

Riguardo alla &, cosa significa ottenere l'indirizzo? Non vado a chiede alla variabile cosa contiene ma vado dove è memorizzata e me la leggo da solo?
E poi & e * sono collegati?

cionci
19-11-2008, 02:53
e non funziona comunque...
Io ho questa struttura:

char variabile;
do
{
variabile=fgetc(file);
send(socket, &file,1,0);
fputs(&tmp, log);
}
while (variabile==10)

Ma non mi esce mai dal ciclo e il file log si riempie in pochi secondi di caratteri che non esistono in "file".
Ci credo, è sbagliato ;)

send(socket, &variabile,1,0);
fputc(tmp, log);

Con & ottieni appunto l'indirizzo dove è memorizzata la variabile. Una variabile puntatore serve appunto a contenere un indirizzo. Comunque te l'ho detto: sono cose che non si possono improvvisare, per spiegare l'utilizzo dei puntatori servono due capitoli di un libro ;)

banryu79
19-11-2008, 13:09
Sì, fidati di quel che ti ha detto Cionci: quando un neofita inizia lo studio della programmazione da zero, e si trova davanti per la prima volta il concetto di puntatore e i vari usi che se ne fanno, di solito ci mette un bel po' a inghiottirlo e digerirlo per bene.

E' una cosa fondamentale sapere cosa sono e come e quando e perchè si usano i puntatori: non puoi raccattare una parvenza di conoscenza qui, se la cosa ti interessa sul serio, è necessario un buon libro.

MrModd
19-11-2008, 20:20
Oki, per i puntatori leggerò qualcosa di più esteso, ma il programma continua a funzionare...
Si blocca sempre lì, scrive tante "ÿ" nel file ma non va avanti.

MrModd
19-11-2008, 21:14
Ho individuato l'errore (penso):
il fatto è che io dovrei leggere il file fino a che non c'è un ritorno a capo, ma il ciclo condizionale non lo vede.
Io ho messo while (variabile!=10) perchè 10 è il valore decimale per in ritorno a capo, ma il ciclo continua lo stesso.

Vi faccio vedere meglio com'è questo pezzo di programma:

rewind(file);
while (controllo==false || variabile!=EOF)
{
variabile=fgetc(file);
if (variabile==10) //questa condizione dovrebbe accadere se c'è un ritorno a capo
{
variabile=fgetc(file);
if (variabile==10) controllo==true;
}
}
controllo==false;
while (controllo==false || variabile!=EOF)
{
variabile=fgetc(file);
if (variabile==10)
{
variabile=fgetc(file);
if (variabile=='a')
{
variabile=fgetc(file);
if (variabile==10) controllo=true;
}
}
}


Da qui quindi io dovrei prendere il file e leggerlo finchè non trovo una riga vuota. A questo punto è pronto per leggere il resto del file fino a che non trova in una riga il carattere "a" e una riga vuota.
Poi nel caso non li trova il ciclo dovrebbe comunque finire perchè raggiunge l'EOF. Il problema è che scorre in entrambi i cicli tutto il file.

Avete capito più o meno il problema?

cionci
20-11-2008, 09:10
while (controllo==false && variabile!=EOF)

Sta dentro il while fino a quanto una delle due condizioni non è verificata. Con l'or sta dentro il while fino a quando entrambe le condizioni non sono verificate.
Se ci spieghi cosa stai cercando di fare possiamo dirti come farlo in poche linee con il C++.

Metti così: variabile == '\n'

MrModd
20-11-2008, 18:44
Oh ecco, ho risolto finalmente, oltre a quell'errore di aver messo || al posto di && avevo fatto un errore di sintassi: avendo trasformato un do - while in un while, mi ero scordato di togliere il ; alla fine della condizione...
Comunque il programma è un client per l'invio della posta molto rudimentale: su un file imposto, seguendo uno schema ben preciso, tutti i dati necessari per l'invio dell'email e poi, dopo una riga vuota, il corpo del messaggio comprensivo di header. Il programma invia l'email e salva un log in un altro file.
Tutto qui, ma per me è un gran passo.
Ora devo solo fare delle modifiche per introdurre un controllo negli errori che da il server.