C++ TCPClient



  • Hallo zusammen,

    habe ein Problem mit dem TidtcpClient Komponente (Indy TCPClient) Daten die der Server (Indy Server) sendet zu lesen.
    Kann mir da jemand weiter helfen ?
    Hab nach googlen nur einpaar Delphi Beiträge gefunden die mir nicht wirklich helfen.

    Gruß



  • Es wäre gut, wenn du deinen Quelltext mal zeigst, damit dir jemand helfen kann. Ein einfaches "geht nicht" reicht da nicht aus.
    Such deinen Quelltext raus und reduziere ihn auf das nötigste.



  • Mein Problem der Ansatz den ich habe wahrscheinlich komplett falsch ist.
    Aber ich zeige ihn trotzdem :

    Server :

    void __fastcall TfrmMain::TCPServerExecute(TIdContext *AContext)
    {
    	int iLength = AContext->Connection->Socket->ReadLongInt();
    	UnicodeString sMessage = AContext->Connection->Socket->ReadString(iLength);  //Text lesen
    	mLog->Lines->Add(sMessage);
    	String sSwitch = sMessage.SubString(0,1);
    
    	if(sMessage == "R1" && iReady<=2){
    		iReady++;
    	}else if(sMessage == "R0" && iReady>0){
    		iReady--;
    	}
    
    	lblReady->Caption = "Ready : " + IntToStr(iReady);
    
    	if(iReady==2){
    		AContext->Connection->IOHandler->WriteLn("R1");  //Text schreiben/senden
    	}
    }
    

    Client :

    void __fastcall TfrmMain::TCPClientWork(TObject *ASender, TWorkMode AWorkMode, __int64 AWorkCount)
    
    {
    	String sSMessage = TCPClient->IOHandler->ReadLn(2);   //Text lesen
    	mTest->Lines->Add(sSMessage);
    
    }
    


  • Senden und Lesen im Server- und Client-Code müssen natürlich übereinstimmen!?

    Der Server liest ja die Nachricht (Message), d.h. erst die Länge und dann entsprechend soviele Zeichen.
    Und dein Client muß dementsprechend diese Message senden.

    Wobei ich den weiteren Teil bzgl. Schreiben von "R1" nicht verstehe...



  • Ich hab es jetzt selber lösen können.

    Client schreiben :

    void __fastcall TfrmMain::btnReadyClick(TObject *Sender)
    {
    	if(MessageDlg("Bereit ?", mtConfirmation, TMsgDlgButtons() << mbYes << mbNo,0) == mrYes){
    	         TCPClient->IOHandler->WriteLn("B1");            //Nachricht schreiben
    	}else{
    		//Ansonst fehlermeldung ausgeben
    		ShowMessage("Fehler beim schreiben");
            }
    }
    

    Server lesen/schreiben :

    void __fastcall TfrmMain::TCPServerExecute(TIdContext *AContext)
    {
    	try{
    		bool bTest=false;
    		String sMessage = AContext->Connection->IOHandler->ReadLn();        //Nachricht lesen die client schickt
    		mLog->Lines->Add(sMessage);
    		String sSwitch = sMessage.SubString(0,1);
    
    		if(sMessage == "B1" && iReady<2){                                  //Nachricht enthält B1 dann Ready ++
    			iReady++;
                            bTest=false;
    		}
    
    		if(!bTest){
    			if(iReady==2){                                                      
    				TList *ClientList = TCPServer->Contexts->LockList();                   //Anzahl verbundener Clients
    				for(int i=0;i < ClientList->Count ; i++){                              //An jeden Client nachricht senden
    					AContext = (TIdContext*) ClientList->Items[i];                        
    					AContext->Connection->IOHandler->WriteLn("B1");                //nachricht zu client schicken
    				}
    			        delete ClientList;
    			        bTest=true;               
                            }
    		}
    	}catch(Exception *e){
    		ShowMessage("Fehler beim Lesen/Schreiben!");
    	}
    }
    

    Client lesen :

    void __fastcall TfrmMain::tReadTimer(TObject *Sender)
    {
    	//timer welcher prüft ob nachrichten vom server da sind
    	try{
    		if(TCPClient->Connected()){                             
                            pnlConnection->Color = clLime;
    			if(!(TCPClient->IOHandler->InputBufferIsEmpty())){       //Prüfen ob text zum lesen da ist
    				sMessage = TCPClient->IOHandler->ReadLn();       //Text lesen
    				MessageRead(sMessage);                           //eigene funktion welche die nachricht filtert
    			}
    		}else{
    			TCPClientDisconnected(btnDisconnect);
            }
    	}catch(Exception *e){
    		ShowMessage("Fehler beim Lesen!");
    	}
    }
    

Anmelden zum Antworten