PDA

Visualizza la versione completa : [C++] Socket recv


tcc
18-06-2010, 09:57
Salve a tutti.
Sto implementando un programmino per ricevere da socket TCP.
Il tutto deve essere inserito in una struttura.


Ecco il codice:

typedef struct {
int m_textLength;
}HEADER;

typedef struct {
HEADER m_header;
char m_buf[MAXRECV];
}MSG;





string CCommunication::receive(int sock){


string line;
MSG* pMsg = new MSG;
memset ( pMsg, 0, sizeof(MSG));
int status = ::recv ( sock, pMsg, sizeof(HEADER), 0 );
if ( status < 0) {
cout << " Error recv" << endl;
}
int lengthMessage = pMsg->m_header.m_textLength;
cout << "CCommunication: " << lengthMessage << endl;
int byteReads = ::recv ( sock, pMsg->m_buf, lengthMessage , sizeof(MSG) - sizeof(HEADER) );
while (byteReads < lengthMessage) {
//Messaggio spezzettato
byteReads = ::recv ( sock, pMsg->m_buf , lengthMessage, lengthMessage - byteReads );
}

if ( byteReads < -1 ) {
cout << " Error recv" << endl;
}

line = pMsg->m_buf;
return line;
}




Ho alcuni dubbi su queste cose??
Non riesco a leggere l'intero come posso fare???

oregon
18-06-2010, 10:10
S, ma dicci qualcosa di pi ... non puoi mollare tutto con queste due parole sperando che qualcuno si faccia carico interamente del problema ... un forum, non un help desk ... :)

Intanto non ha senso dire "il tutto deve essere inserito in una struttura" ... che vuoi dire?

"Ho alcuni dubbi su queste cose??" una domanda ? O cosa?

"Non riesco a leggere l'intero come posso fare???" ... ovvero? Ma tu perch hai scritto TUTTO quel codice? Commentalo, descrivilo, indica dove vorresti ottenere questo "intero" e come ti accorgi che non lo ricevi ...

Insomma ...

tcc
18-06-2010, 10:30
Ho riscritto il codice cercando di inserire prima nel buf e poi copiare l'intero nella struttura.



char buf [MAXRECV];
string line;

MSG* pMsg = new MSG;
memset ( pMsg, 0, sizeof(MSG));
memset(buf,0,MAXRECV);


//Devo leggere l'intero e lo inserisco nel buf
int status = ::recv ( sock, buf, sizeof(HEADER), MSG_NOSIGNAL);
if ( status < 0) {
cout << " Error recv" << endl;
}
// lo copio nella struttura header.
memcpy(&(pMsg->m_header.m_textLength), buf, sizeof(HEADER));
int lengthMessage = pMsg->m_header.m_textLength;


cout << "CCommunication: " << pMsg->m_header.m_textLength << endl;
// faccio la prima recv per inserirla nel buf
int byteReads = ::recv ( sock, pMsg->m_buf, sizeof(MSG) - sizeof(HEADER) , MSG_NOSIGNAL );

// vedo per vedere se la stringa letta stata presa tutta altrimenti devo leggere ancora
while (byteReads < lengthMessage) {
//Messaggio spezzettato
byteReads = ::recv ( sock, pMsg->m_buf , lengthMessage - byteReads, MSG_NOSIGNAL );
}

if ( byteReads < -1 ) {
cout << " Error recv" << endl;
}

line = pMsg->m_buf;
return line;


Per capire l'intero non lo prende bene, ho mandato un char buff = {'A','0','0','0','C','i','A','\0'}
ma mi d un numero strano.

Loading