Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Dubbio bidirezionalità socket
Forum - C/C++ - Dubbio bidirezionalità socket

Avatar
mberny88 (Normal User)
Newbie


Messaggi: 6
Iscritto: 30/07/2012

Segnala al moderatore
Postato alle 9:33
Lunedì, 30/07/2012
Questo topic è stato chiuso dal moderatore

CIao a tutti, volevo chiedere un chiarimento su una questione relativa ai socket in c/c++. Io so che i socket sono bidirezionali. Io devo fare due thread in cui uso due socket in cui in ognuno di esse leggo e scrivo( in un thread un socket scrive e uno legge e nell'altro viceversa). Tra i due thread bisogna gestire una specie di concorrenza o no?

Grazie

PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 9:49
Lunedì, 30/07/2012
di solito si sincronizzano i thread quando devono condividere dei dati.
devono condividere dei dati?

PM
Avatar
mberny88 (Normal User)
Newbie


Messaggi: 6
Iscritto: 30/07/2012

Segnala al moderatore
Postato alle 9:54
Lunedì, 30/07/2012
No non devo condividere dati. Un socket è di tipo AF_INET6 DATAGRAM e l'altro è di tipo AF_PACKET DATAGRAM. I due thread devono solo inviare da una parte all'altra tra questi canali. Il mio dubbio era che visto che i due thread accedevano e scrivevano e leggevano contemporaneamente daò thread se c'era un problema di conflitto!!  

PM
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 20:24
Lunedì, 30/07/2012
E' una domanda un po' vaga... ma in linea generale il sistema operativo si prende carico di assicurarsi che tu possa leggere e scrivere contemporaneamente su una socket.


Il mio blog: https://piero.dev
PM
Avatar
mberny88 (Normal User)
Newbie


Messaggi: 6
Iscritto: 30/07/2012

Segnala al moderatore
Postato alle 13:18
Martedì, 31/07/2012
Ok grazie, ora però ho un altro problema: ho scritto un'applicazione in c++ che permette di inviare pacchetti da una porta (dove è attaccato un device rfid) e l'ethernet.
L'applicazione scritta su 64bit mi funziona ma per motivi di tesi devo portarla su un pc a 32 bit. La parte di codice che mi dà fastidio è la seguente:


while(1) {

    try {
        
            length_receive=recvfrom(par->sock2.fd, buffer,BUFFER_LENGTH,0,
                                (struct sockaddr*)par->address2.address,
                                &par->address2.address_length);

            if(length_receive==-1) {throw RecvfromException ();}
        
        } catch (RecvfromException e) {e.getDescription ();}
        std::cout <<"Ricevuto il pacchetto dall'interfaccia'\n"<<std::endl;

        IPv6Packet packet=IPv6Packet (buffer,length_receive);
        packet.printInEx (' ');
        std::cout <<"Lunghezza:"<< length_receive << std::endl;


        try {
            
            length_send=sendto(par->sock1.fd, buffer,length_receive,0,
                               (const struct sockaddr*)par->address1.address,
                              par->address1.address_length);
    
            if(length_send==-1) {throw SendToException ();}

        } catch(SendToException e) {e.getDescription ();}
        std::cout << "Rispedito al sunspot\n"<<std::endl;
[\code]

una volta che parte la prima recvfrom, il while gira e incomincia a inviare pacchetti che non sono inviati. È come se il buffer invia i pacchetti precedenti insieme a quello nuovo. Questo solo nella 32bit. È un problema di compilatore? Come posso risovlvere?

Ultima modifica effettuata da mberny88 il 31/07/2012 alle 13:19
PM
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 14:04
Martedì, 31/07/2012

devi aprire un altro thread per un'altra domanda, qui chiudo.

PM