Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [C++] Socket recv

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313

    [C++] Socket recv

    Salve a tutti.
    Sto implementando un programmino per ricevere da socket TCP.
    Il tutto deve essere inserito in una struttura.
    codice:
    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???

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,465
    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 ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    May 2004
    Messaggi
    313
    Ho riscritto il codice cercando di inserire prima nel buf e poi copiare l'intero nella struttura.
    codice:
    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.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.