senden und empfangen auf der gleichen Buchse aus verschiedenen threads funktioniert nicht

Habe ich gelesen, dass Sie sollten sicher sein, aus verschiedenen threads gleichzeitig, aber mein Programm hat sich etwas komisch Verhalten und ich weiß nicht, was falsch ist.

Habe ich threads gleichzeitig die Kommunikation mit einem client-socket

  1. ein senden an eine Steckdose
  2. eine tun und wählen Sie dann "recv" - Vorgang aus der gleichen Steckdose

So, ich bin immer noch senden, der client hat bereits die Daten erhalten und der socket geschlossen.
Zur gleichen Zeit, ich mache eine select-und recv auf, dass die Steckdose, die gibt 0 zurück (da ist es geschlossen), so dass ich in der Nähe dieser Buchse. Doch, die senden noch nicht wieder dabei ist...und da ich in der Nähe nennen, die auf diesem sockel den senden-Aufruf schlägt mit EBADF.

Ich weiß der client die Daten erhalten hat, korrekt, da ich die Ausgabe, nachdem ich in der Nähe der Steckdose und es ist richtig. Aber, auf mein Ende, mein senden-Aufruf noch einen Fehler (EBADF), so möchte ich, um es zu beheben, damit es nicht scheitern.

Funktioniert dies nicht immer. Es passiert vielleicht 40% der Zeit. Ich benutze nicht überall schlafen. Bin ich der angeblich die Pausen zwischen sendet oder recvs alles oder?

Hier einige code:

Senden:

while(true)
{
    //keep sending until send returns 0
    n = send(_sfd, bytesPtr, sentSize, 0);

    if (n == 0)
    {
        break;
    }
    else if(n<0)
    {
        cerr << "ERROR: send returned an error "<<errno<< endl; //this case is triggered
        return n;
    }

    sentSize -= n;
    bytesPtr += n;
}

Empfang:

 while(true)
{
    memset(bufferPointer,0,sizeLeft);
    n = recv(_sfd,bufferPointer,sizeLeft, 0);
    if (debug) cerr << "Receiving..."<<sizeLeft<<endl;
    if(n == 0)
    {
        cerr << "Connection closed"<<endl; //this case is triggered
        return n;
    }
    else if (n < 0)
    {
        cerr << "ERROR reading from socket"<<endl;
        return n;
    }
     bufferPointer += n;
     sizeLeft -= n;
     if(sizeLeft <= 0) break;

}

Auf dem client, ich benutze den gleichen code erhalten, den ich dann rufen Sie close() auf den socket.
Dann auf meiner Seite, bekomme ich 0 von der der Anruf empfangen und auch rufen Sie close() auf den socket
Dann meine schicken, schlägt fehl. Es ist immer noch nicht fertig?! Aber meine Kunden haben bereits die Daten!

  • Bitte fügen Sie einige code. Möglicherweise gibt es Fehler Fremd zu dem, was Sie vermuten.
  • Danke, ich werde hinzufügen von code
  • Könnte geben Sie immer die Buchse a reference count.
  • Was meinst du? Wie wirkt sich das halten einer Referenz den Fehler vermeiden? Ich dachte gleichzeitige senden und recvs sind ok?
InformationsquelleAutor yuf | 2013-03-12
Schreibe einen Kommentar