programmazione di rete in C

Postate qui per tutte le discussioni legate a Linux in generale.

Moderatore: Staff

Regole del forum
1) Citare sempre la versione di Slackware usata, la versione del Kernel e magari anche la versione della libreria coinvolta. Questi dati aiutano le persone che possono rispondere.
2) Per evitare confusione prego inserire in questo forum solo topic che riguardano appunto Gnu/Linux in genere, se l'argomento è specifico alla Slackware usate uno dei forum Slackware o Slackware64.
3) Leggere attentamente le risposte ricevute
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

programmazione di rete in C

Messaggio da sya54M »

salve, sto facendo un programmino in c per effettuare una connessione ftp:
invia il nome utente, il server risponde 331 e quindi ok, ma il programmino acquisisce la stringa sbagliata dalle risposte del server invece di quella consecutiva all'invio del nome utente che contiene l'ok.
oh aperto un soket con:

Codice: Seleziona tutto

sockfd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
ho inviato la stringa con il nome utente con:

Codice: Seleziona tutto

send(sockfd, stringa, (strlen(stringa)), 0);
il server da l'ok.
e devo leggere l'ok con:

Codice: Seleziona tutto

recv(sockfd, buffer, 10000, 0);
ma nella lettura come gia detto non legge l'ok consecutivo all'invio del nome utente, ma legge una parte della striga di benvenuto che non centra niente.

spero di essere stato chiaro e che possiate aiutarmi, ringrazio in anticipo!

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

La stringa di benvenuto viene restituita prima dell' ok?
Perchè se è così il tuo buffer potrebbe essere piccolo....

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Messaggio da sya54M »

SI, la stringa di benvenuto è prima dell'ok,
ci ho pensato anchio a questo problema e ho provato con un buffer di 100000, ma la striga che mi serve non viene letta

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

Come esegui il parsing della stringa?

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Messaggio da sya54M »

non usato nessun parser.
mi sugeriresti tu in che modo potrei farlo? non lho mai fatto.
ma è necessario fare il parsing della stringa?

io ho fatto un confronto tra stringhe in questo modo:

Codice: Seleziona tutto

if (strncmp(buffer, "331", 3) != 0)
il problema è che confronto la stringa sbagliata!

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

sya54M ha scritto:

Codice: Seleziona tutto

if (strncmp(buffer, "331", 3) != 0)
Se non sbaglio, in questo modo il confronto viene fatto con l'inizio della stringa e la non c'è l'ok
Forse il tuo buffer è

buffer = buffer + strlen(buffer) - strlen("331")

in questo modo fai il controllo con la parte finale della stringa....

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Messaggio da sya54M »

si è vero, il confronto viene fatto con l'inizo della stringa come ho fatto io, infatti se venisse letta la striga giusta, il numero 331 con il quale faccio il confronto si troverebbe all'inizio della stringa e quindi dovrebbe essere giusto.
il problema è sempre che la stringa con il 331 (e quindi con l'ok) non viene proprio aquisita con questa funzione:

Codice: Seleziona tutto

recv(sockfd, buffer, 10000, 0);
infatti come gia detto recv acquisisce la prima stringa di benvenuto invece dell'ok

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

A questo punto sospetto che alla fine della stringa di benvenuto ci sia un terminatore ( '\0' )
Dovresti allora leggere ancora dal buffer per acquisire la stringa successiva...

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Messaggio da sya54M »

infatti ho provato a copiare la funzione per la lettura per eseguirla 2 volte (mi era venuto in mente anche a me) ma il risultato è che viene letta 2 volte la stessa stringa :cry:

oppure intendi che sia necessario fare una nuova scrittura prima di una seconda lettura? io ho fatto 2 letture consecutive senza fare una seconda scrittura (ho provato anche a farlo leggere in un loop fino alla giusta condizione ma va all'infinito)

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

oppure intendi che sia necessario fare una nuova scrittura prima di una seconda lettura?
A questo punto proverei a fare così.... non so più cosa dirti....

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Messaggio da sya54M »

sei grande v! ho aggiunto una seconda scrittura con un "\n" e una seconda lettura e funziona!, quindi per fare una seconda lettura (recv) bisogna per forza fare una seconda scrittura (send) altrimenti legge sempre la stessa cosa.

ora posso andare avanti a correggere altri errorri :oops:

grazie

Avatar utente
V
Linux 2.x
Linux 2.x
Messaggi: 313
Iscritto il: gio 23 mar 2006, 10:54

Messaggio da V »

Di niente! Hai fatto tutto da solo!
Buon lavoro!

Rispondi