Socket Problem mit Thread



  • Hallo,
    ich habe ein sehr komisches Problem

    Ich habe eine Serveranwendung und eine Clientanwendung programmiert.
    Mit dem Server ist alles in Ordnung.
    Der Client hat einen TThread, mit dem er immer recv abfragt.
    Wenn der Client jetzt was sendet, bekommt er was zurückgesendet, mehrere Bilder, dies geht also so ca 2s.
    Wenn ich den Client in den 2s in den Hintergrund verfrachte, also ein anderes Programm in den Vordergrund hol, kommen ab dem Moment, wo es in den Hintergrund geschickt wurde keine Daten mehr an.
    Jetzt muss ich neu connecten.

    Hier mal der Threadcode:

    __fastcall TRecThread::TRecThread(bool CreateSuspended, SOCKET *s_t, TImage *image_t)
            : TThread(CreateSuspended)
    {
            s = *s_t;
            MS = new TMemoryStream;
    
            image = image_t;
    
    }
    //---------------------------------------------------------------------------
    void __fastcall TRecThread::Execute()
    {
            while (!Terminated)
            {
                    if (String(WSAGetLastError()) != "0")
                    Form1->Caption = String(WSAGetLastError());
                    Receive();
    if (String(WSAGetLastError()) != "0")
                    Form1->Caption = String(WSAGetLastError());
            }
    }
    //---------------------------------------------------------------------------
    void __fastcall TRecThread::Receive()
    {
    
    /*
    machen = 0;
    left = 0;
    top = 0;
    nextgrosse = 0;
    receivedall = 0;
    */
            receivedbytes = recv(s, buf, sizeof(buf), 0);
    
            if (String(WSAGetLastError()) != "0")
            {
                    Application->MessageBox(String(WSAGetLastError()).c_str(),"a",0);
            }
            switch (receivedbytes)
            {
                    case 0:
                            Application->MessageBox("FEHLER","FEHLER",16);
                            Terminate();
                    break;
                    case SOCKET_ERROR:      // DISCONNECT;
                                    Application->MessageBox("FEHLER","FEHLER",16);
                                            Terminate();
    
                    break;
    
                    default:
                        buf[receivedbytes]='\0';
    
                                  MS->Seek(0, soFromEnd);
                                  MS->WriteBuffer(&buf, receivedbytes);
    
                                  MS->Seek(0 , soFromBeginning);
    
                                  if (machen == 0) MS->ReadBuffer( &machen, sizeof(int));
    
                                  if ((top == 0) && (MS->Size >= 3 * sizeof(int) + sizeof(__int64)))
                                  {
                                              MS->Seek( sizeof(int), soFromBeginning);
                                              MS->ReadBuffer( &nextgrosse, sizeof(__int64) );
    
                                              MS->ReadBuffer( &left, sizeof(int) );
                                              MS->ReadBuffer( &top, sizeof(int) );
                                           //  Application->MessageBox( String(nextgrosse).c_str(), "a",0);
    
                                  }
    
                                  if (MS->Size >= 3 * sizeof(int) + sizeof(__int64) + nextgrosse)
                                  {
    
                                              MS->Seek( 3 * sizeof(int) + sizeof(__int64), soFromBeginning);
    
                                              unsigned char *blubb;
    
                                              blubb = (unsigned char*)malloc(nextgrosse);
    
                                              MS->ReadBuffer(blubb, nextgrosse);
    
                                              TMemoryStream *MS2 = new TMemoryStream;
                                              MS2->WriteBuffer (blubb, nextgrosse);
    
                                              switch (machen)
                                              {
                                                      case SND_PICTURE:
                                                        //Picture_Recv(MS, image);
    
                                                                      Graphics::TBitmap* Bild = new Graphics::TBitmap;
                                                                      TJPEGImage *jpg = new TJPEGImage;
    
                                                                      Form1->Memo1->Lines->Add ( String(left) + "_" + String(top) );
    
                                                                              MS2->Seek(0 , soFromBeginning);
                                                                              jpg->LoadFromStream(MS2);
                                                                              jpg->SaveToFile(".\\hallo\\" + String(left) + "_" + String(top) + "_a.jpg");
                                                                              Bild->Assign(jpg);
    
                                                                            image->Canvas->CopyRect( Rect(left * PICTURE_WIDTH, top * PICTURE_HEIGHT, Bild->Width, Bild->Height), Bild->Canvas,  Rect(0, 0, Bild->Width, Bild->Height) );
    
                                                                      //
                                                                      delete Bild;
                                                                      Bild = NULL;
                                                                      delete jpg;
                                                                      jpg = NULL;
    
                                                      break;
    
                                              }
    
                                              if (MS->Size == 3 * sizeof(int) + sizeof(__int64) + nextgrosse)
                                              {
                                                    MS->Clear();
                                              }
                                              else
                                              {
                                                    ZeroMemory(blubb, nextgrosse);
                                                    blubb = (unsigned char*)malloc(MS->Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse));
                                                    MS->ReadBuffer(blubb, MS->Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse));
                                                    MS2->WriteBuffer(blubb, MS->Size - (3 * sizeof(int) + sizeof(__int64) + nextgrosse) );
    
                                                    MS->Clear();
                                                    MS->LoadFromStream(MS2);
                                                    //Application->MessageBox("neu","neu",16);
                                              }
    
                                              machen = 0;
                                              left = 0;
                                              top = 0;
                                              nextgrosse = 0;
    
                                              delete MS2;
                                              delete blubb;
    
                                   }
    
            }
                    ZeroMemory(buf, sizeof(buf));
    
    }
    
    //---------------------------------------------------------------------------
    

    Woran kann das liegen ?
    Ich hab schon so einiges ausprobiert.
    Wenn der Client im Vordergrund bleibt, bekommt er alles gesendet.
    Der Server schickt auch alles.
    WSAGetLastError() gibt immer 0.

    Danke, Tim



  • Durchläuft das Programm deine Routinen noch wenn dus in den Hintergrund schickst?

    -junix



  • ja, er hängt in recv()

    aber ich werde jetzt mal die winsocket2 funktionen nutzen...

    Tim


Anmelden zum Antworten