Chat mit TCP/IP



  • blackworm schrieb:

    ACHTUNG - NEUE ERKENNTNIS

    und zwar:

    der sendet die daten und sie werden angezeigt, nur bis sie auf der serverseite angezeigt werden, vergehen um die 13 sekunden.
    und in der zeit lässt der das serverprogramm auch nichts mehr mit sich anfangen...

    ist das normal mit der verzögerung???

    ich teste das alles auf einem rechner(also mit 127.0.0.1, oder localhost oder loopback...wie auch immer)

    denn es kaommt auf die länge drauf an 🙂
    umso länger der string ist, desto länger braucht auch die übertragung



  • [quote="tuempl"]aber hast du das CArchive angelegt bevor die message eingetroffen ist?[quote]

    wenn nicht könnte das auch eine verzögerung hervorrufen...



  • ja, genauso habe ich es...

    ich möcht nur nochmal darauf hinweisen, dass es auf die länge des cstrings ankommt, wie lange er für die daten braucht...

    kannst nur nich verstehen, dass er für ein paar zeichen so lange übertragen muss

    p.s.: ich muss grad weg 😞

    aber ich hoff, dass ich möglichst schnell wieder da bin.

    ciao und vielen dank schonmal für eure hilfe



  • die übertragung dürfte auf keinen fall so lang dauern. poste erstmal alle für die verbindung wichtigen quelltextteile...



  • das einzige was mich noch stört, ist, dass ich auf der client seite den kompletten socket schließen muss, damit auf der serverseite was ankommt :-\



  • oke

    also erstmal client

    void CeasyClientDlg::OnBnClickedConnect()
    {
    	m_client.Create();
    	m_client.Connect("127.0.0.1"/*m_hostname*/,555/*m_port*/);
    	mp_senden = new CSocketFile(&m_client);
    	mp_arOut = new CArchive(mp_senden,CArchive::store);
    
    }
    
    void CeasyClientDlg::OnBnClickedSend()
    {
    	(*mp_arOut).WriteString("Hallo\0"/*m_msg*/);
    	mp_arOut->Flush();
    	//mp_senden->Close();
    	//m_client.Close();
    	delete mp_senden;
    //	m_client.Send()
    }
    

    server:

    void CServeranwendungDlg::OnBnClickedStart()
    {
    	if(m_server.Create(555/*5311*/,SOCK_STREAM))		//wenn Server startt
    	{
    		m_createdOK = 1;											//Statusmelder
    		UpdateData(false);
    		if(m_server.Listen())										//wenn Server lauscht
    		{
    			m_listenedOK = 1;										//Statusmelder
    			UpdateData(false);
    			if(m_server.Accept(m_tmpServer))						//wenn Server akzeptiert Verbindung 
    			{
    				m_acceptedOK = 1;									//Statusmelder
    				UpdateData(false);
    				mp_empfangen = new CSocketFile(&m_tmpServer);
    				mp_arIn = new CArchive(mp_empfangen,CArchive::load);
    			}	
    		}	
    	}
    }
    
    void CServeranwendungDlg::OnReceive()
    {
    	Beep(300,1000);
    	m_durchlauf++;
    	UpdateData(false);
    	Serialize();
    
    }
    
    void CServeranwendungDlg::Serialize()
    {
    	CString test;
    	mp_empfangen->SeekToBegin();
    	if(mp_arIn->ReadString(test)== 1)
    	{
    		m_connectedOK = TRUE;
    		UpdateData(false);
    		m_ctlIncoming.AddString(test);
    	}
    
    }
    

    das dürften so die relevaten quelltexte sein



  • (*mp_arOut).WriteString("Hallo\0"/*m_msg*/);
    

    was soll das \0 ? durch die " wird der string automatisch nullterminiert. du terminierst ihn sozusagen doppelt. aber das wird nicht der grund sein.

    if(m_server.Accept(m_tmpServer))
    			{
    				m_acceptedOK = 1;
    				UpdateData(false);
    				mp_empfangen = new CSocketFile(&m_tmpServer);
    				mp_arIn = new CArchive(mp_empfangen,CArchive::load);
    			}
    

    das sollte meinermeinung nach in CDeinListeningServer::OnAccept(...) stehen. so wie du das hast muss der client genau in dem augenblick connect machen nachdem m_server Listen() aufgerufen wird aber bevor Accept(...) aufgerufen wird. das könnte das problem sein.

    mp_empfangen->SeekToBegin();
    

    wofür das? ich hab die funktion noch nie verwendet, aber schon erfolgreich programme die übers internet arbeiten geschrieben. ist also entweder unnötig oder vielleicht der fehler.

    ich hoffe irgendwas von dem was ich gesagt hab hilft, viel glück.



  • vielen dank für deine hilfe,

    ich werde gleich mal deine tipps ausprobieren

    😉

    danke nochmal 🙂



  • hmm...geht leider nicht... 😞

    muss ich auf seiten des clients noch irgendein ereignis beachten ???
    also z.b. OnSend oder so ???

    void CServeranwendungDlg::jojo()
    {
    	CString test;
    	if(mp_arIn->ReadString(test)== 1) //bei dieser zeile bleibt er hängen, bis ich den die verbindung zum client schließe, dann macht er an dieser stelle weiter
    	{
    		m_connectedOK = TRUE;
    		UpdateData(false);
    		m_ctlIncoming.AddString(test);
    	}
    
    }
    


  • meiner meinung nach hat nur OnAccept(...) gefehlt (aber das hab ich eh schon oben geschrieben).
    versuch mal einen int wert mit hilfe der << und >> operatoren zu senden um zu überprüfen ob der fehler an der verwendung von WriteString oder ReadString liegt.



  • ja, das geht 😉

    hab jetzt auch nochmal einen nächsten thread gepostet...

    wie benutze ich denn genau ReadStrin und WriteString ???

    Da gibt es wohl einige besonderheiten...


Anmelden zum Antworten