PDA

Visualizza la versione completa : [C-linux-socket] errore lettura recv()


shadyz
14-01-2009, 20:07
Ciao a tutti. Ho creato un client che deve comunicare con un server su un altro computer.
Dopo aver mandato un primo messaggio al server, questo mi risponde, quindi tutto ok.
Se mando subito dopo un altro messaggio, il server non risponde più, quando invece quest'ultimo è impostato per rispondere.

la sintassi per ricevere è la stessa del primo messaggio ed è la seguente:



char buf2[1024];
int ric;

memset (&buf, 0x0, 1024);
ric = recv (sd, &buf2, sizeof(buf2), 0);
printf ("Ritorno messaggio\t: %s\n", buf2);
printf ("Valore messaggio\t: %i\n", ric_cvr);


Il messaggio mi ritorna una stringa vuota ed il valore di "ric" è 0, segno che non ho ricevuto nulla.
Ho provato anche a impostare il socket come non-bloccante, ma il risultato è lo stesso.

Mi chiedevo se la procedura fosse corretta, oppure se dopo aver fatto un primo send()-recv() bisognasse fare qualcosa prima di mandarne un altro.
Grazie.

XWolverineX
14-01-2009, 20:12
Il socket ricevente è quello restituito da Accept

PeppePes88
14-01-2009, 20:50
Dipende da come hai fatto il server!!! L'hai programmato per gestire la risposta a più client ???

Posta tutto il codice!!! O almeno quello del server.... Perchè cosi è un po poco per poterti aiutare!!!

Un consiglio per capire che errori avvengono, conviene mettere la recv in un if è chiamare la perror();



if ( (ric = recv(....)) < 0 )
perror("Errore recv\n");

shadyz
15-01-2009, 00:40
@PeppePes88: grazie del consiglio, comunque se c'è un errore lo vedo anche con il valore del ric:
printf ("Valore messaggiot: %i", ric); (come valore ricevo 0)

Il server comunque non l'ho creato io: è quello di msn messenger. Sto tentando di fare una connessione. In poche parole prima di fare il login con user e password devo mandare alcuni messaggi di benvenuto. Il primo lo mando e ricevo risposta, mentre il secondo lo mando (penso) ma non ricevo nulla. Per questo mi chiedevo se tra un send() e l'altro si dovesse fare qualcosa (magari per mantenere la connessione, ma non penso che cada).

L'accept() non è solo per i server?

L'ordine delle mie funzioni è il seguente:
1) socket()
2) bind ()
3) connect ()
4) send() e recv()
5) send() e recv() <-- non funziona la recv()

PeppePes88
16-01-2009, 13:50
L'accept() non è solo per i server?


Di solito si.....

dovrai seguire il protocollo di msn per interfacciarti... Perchè non provi a postare un po di codice del client
cosi vedo se ti posso essere piu di aiuto!!!

Loading