Chat mit TCP/IP
-
und wie hol ich die daten auf der serverseite ab???
mit arIn.ReadString(ausgabe) ????
-
ja, natuerlich kann man CStrings ohne serialize via TCP/IP uebers ethernet verschicken. geht eigentlich mit CSocket alleine, bzw mit CAsyncSocket.
Esco
-
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)
-
ja eigentlich schon...aber hast du das CArchive angelegt bevor die message eingetroffen ist? du solltest es anlegen wenn die verbindung steht (also gleich nach dem aufruf von CSocket::Accept().
ich hab das in nem alten projekt so:
m_pArchiveIn = new CArchive(m_pFile,CArchive::load);
-
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...