Socketprogrammierung...OnConnect..OnReceive
-
Hi
ich möchte gerne prüfen ob der Verbindungsaufbau erfolgreich war...
Dachte da zuerst an die OnConnect Methode der Klasse ASyncSocket... doch leider funktionierte nichts was ich ausprobiert hatte...
dann hab ich mal in der MSDN nachgesehen was denn so die funktion Connect zurück gibt.
doch leider was ich da Probiert habe klappt auch nicht. Kennt jemand von euch nen howto oder tutorial wo diese Methoden OnConnect,OnReceive OnAccept OnSend usw beschrieben werden?? In der MSDN steht leider nichts drin...oder kann mir codeschnipsel geben, irgendwas womit ich was anfangen kann. Wär euch sehr dankbar.
-
im clientprogramm:
void CVerbindung::OnConnect(int nErrorCode) { CAsyncSocket::OnConnect(nErrorCode); if (!nErrorCode) { // Alles 1A! } else { // verbindung konnte nicht hergestellt werden. } }
wobei CVerbindung eben von CAsysncSocket abgeleitet ist. steht glaub' im buch von richard c. leinecker ua. drin.
Esco
-
Gleiches Problem wie hier
http://www.c-plusplus.net/forum/viewtopic.php?t=89450
Hoffe doch nicht das du das bist.
Im Buch VC++ 6 in 21 Tagen gibt es ein Bsp.
Such mal hier im Forum oder im Netz. Gibts Online zu lesen
-
nein unix tom das bin ich nicht...
hm werde das nacher mal testen..
und das buch vc++ in 21 tagen kenne ich, finde es nru ziemlich *piep* beschrieben, desswegen suche ich etwas besseres
-
@esco... soll ich nachdem ich die OnConnect in der CVerbinden.cpp "geschrieben" habe im main.cpp aufrufen?
oder wird die automatisch aufgerufen?zudem muss ich sie als virtual deklarieren in der CVerbinden oder kann ich sie normal überschreiben?? Weil sie ja in der ASyncSocket Klasse schon vorhanden ist....
-
mag sein das du das buch schlecht findest aber es beschreibt genau was du brauchst
-
snoopdog schrieb:
@esco... soll ich nachdem ich die OnConnect in der CVerbinden.cpp "geschrieben" habe im main.cpp aufrufen?
oder wird die automatisch aufgerufen?zudem muss ich sie als virtual deklarieren in der CVerbinden oder kann ich sie normal überschreiben?? Weil sie ja in der ASyncSocket Klasse schon vorhanden ist....
um dich nun mit dem server zu verbinden musst du nur die Connect methode aufrufen. OnConnect wird selber aufgerufen (windowmessage!).
wenn du eine methode virtuell deklarieren willst, dann müsstest du das nicht in der subklasse machen, sondern in CAsyncSocket selber. also kein virtual.
Esco
-
ok also dienen diese On Methoden der WindowsNachrichtenverwaltung?!
Danke @ esco. Werds inner Mittagspause mal testen.
-
@eco hab es jetzt getestet... leider funktioniert es nicht...
die Methode OnConnect wird nicht aufgerufen...
habe die Klasse MySocket diese ist von ASyncSocket abgeleitet..
habe dort die methode OnConnect deklariert..
void OnConnect(int nErrorCode);
so dann bin ich in die cpp datei gegangen und habe die Methode mit inhalt gefüllt...
void MySocket::OnConnect(int nErrorCode) { CAsyncSocket::OnConnect(nErrorCode); if(!nErrorCode) { MessageBox(NULL,"Jeha","",MB_OK); } else { MessageBox(NULL,"Fehler","",MB_OK); } }
so, ich habe eine weitere klasse CVerbinden die einem Dialog zugrunde liegt. über diesen dialoge verbinde ich mich mit meinem server.
void CVerbinden::OnVerbinden() { UpdateData(TRUE); pMySocket->Connect(m_Serverliste,1500); }
in m_Serverliste steht die IP drin...
also er verbindet sich schon einwandfrei nur wird leider keine meldung ausgeben, obwohl es ja in OnConnect drin steht...
hoffe du weißt Rat...
-
hast du die OnConnect methode manuell deklariert und implementiert?
du solltest das über den klassenassistenten machen, damit die entsprechende windowmessage auch die OnConnect methode aufrufen kann.
Esco
-
Ich sage es nochmal und zum letzten mal.
Schau dir das im Buch VC++ 6 in 21 Tagen an. Dort wird es gemacht.
-
@esco ja habe es manuel gemacht. werde das dann damit mal versuchen.
-
@esco
habe es grade probiert, habe die Methode mit dem Klassenassistenten erstellt, und die die Methode OnConnect bearbeitet..MySocket::MySocket() { } MySocket::~MySocket() { } //Die folgenden Zeilen nicht bearbeiten. Sie werden vom Klassen-Assistenten benötigt. #if 0 BEGIN_MESSAGE_MAP(MySocket, CAsyncSocket) //{{AFX_MSG_MAP(MySocket) //}}AFX_MSG_MAP END_MESSAGE_MAP() #endif // 0 ///////////////////////////////////////////////////////////////////////////// // Member-Funktion MySocket void MySocket::OnConnect(int nErrorCode) { CAsyncSocket::OnConnect(nErrorCode); if(!nErrorCode) { MessageBox(NULL,"Erfolgreich","",MB_OK); } else { MessageBox(NULL,"Fehler","",MB_OK); } }
deklaration in der header:
class MySocket : public CAsyncSocket { // Attribute public: // Operationen public: MySocket(); virtual ~MySocket(); // Überschreibungen public: // Vom Klassen-Assistenten generierte virtuelle Funktionsüberschreibungen //{{AFX_VIRTUAL(MySocket) public: virtual void OnConnect(int nErrorCode); //}}AFX_VIRTUAL // Generierte Nachrichtenzuordnungsfunktionen //{{AFX_MSG(MySocket) // HINWEIS - Der Klassen-Assistent fügt hier Member-Funktionen ein und entfernt diese. //}}AFX_MSG // Implementierung protected: };
doch leider wird keine MessageBox aufgerufen...
wieso??
@unix-tom habe es mir jetzt angesehen bei markt und technik. genau so habe ich es ja auch getan, nur leider klappt es nicht...
-
du sagst, dass keine messagebox aufgerufen wird. besteht denn nach dem Connect-aufruf eine verbindung?
Esco
-
ja wenn der server läuft wird eine verbindung hergestellt... nur läuft der server nicht ist natürlich auch keine verbindung da...