Oppure

Loading
Questo topic e' stato chiuso dal moderatore.
30/07/12 7:33
mberny88
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
aaa
30/07/12 7:49
HeDo
di solito si sincronizzano i thread quando devono condividere dei dati.
devono condividere dei dati?
aaa
30/07/12 7:54
mberny88
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!!
aaa
30/07/12 18:24
pierotofy
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: piero.dev
31/07/12 11:18
mberny88
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 31/07/12 11:19
aaa
31/07/12 12:04
HeDo

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