MFC -> ASyncSocket -> Error Code
-
hallo,
ich bekomme mit der Funktion GetLastError() den Fehler 10035 bei einem Connect() zurück, obwohl es gefunktioniert hat. Woran kann das liegen?
Dank + Gruss
FuXs
-
10035 isst ein Standard Winsock fehler und bedeutet:
Answer/Solution: This is a temporary condition and later calls to the same routine may complete normally. The socket is marked as non-blocking (non-blocking operation mode), and the requested operation is not complete at this time.Also kein Problem, tritt mit AsyncSocket immer auf.
MfG Torsten
-
das problem ist, der fehler kommt immer, so kann ich nicht überprüfen ob der Connect geklappt hat oder nicht, also bekomm ich die fehler nur im OnConnect raus und da ist es zu spät.
Also, wie kann ich sofot überprüfen ob der Connect gefunzt hat oder nicht,
ich hab da jetzt schon x stunden investiert
-
Du bekommst eine Nachricht OnConnect wenn der Connect stattgefunden hat und einen Error wenn nicht
void CMySocket::OnConnect(int nErrorCode) { if (nErrorCode == 0) ((DeindeDlg*)m_pWnd)->OnConnect(); }
-
äh, wie ich weiter oben erwähnt habe, da ist es zu spät.
CSearchSocket* sock = new CSearchSocket; sock->SetParent( this ); sock->Create(); CString sIpAddress = "192.168.100.", sIpTmp; for( int i=1; i<255; i++ ) { sIpTmp.Format( "%s%d", sIpAddress, i ); m_serverlist.InsertString( 0, sIpTmp ); sock->sServerIp = sIpTmp; sock->Connect( sIpTmp4000 ); }das ist meine schleife die abfragen soll, auf welcher ip ein server läuft.
ich hatte mir das so vorgestellt:CSearchSocket* sock = new CSearchSocket; sock->SetParent( this ); sock->Create(); CString sIpAddress = "192.168.100.", sIpTmp; for( int i=1; i<255; i++ ) { sIpTmp.Format( "%s%d", sIpAddress, i ); m_serverlist.InsertString( 0, sIpTmp ); sock->sServerIp = sIpTmp; if( sock->Connect( sIpTmp, 4000 ) ) { // server gefunden } }
-
Wenn Connect zurückliefern würde ob erfolgreich, dann wäre das nicht mehr asynchron. Synchron ist CSocket - dort geht das so (Aber: Send & Receive sind dann auch synchron!).
-
wenn das so ist,
hab ich quasi gar keine chance rauszufinden auf welcher ip ein server läuft
-
Na doch - kannst du CAsyncSocket::GetPeerName aufrufen.
-
dann würde meine funktion so aussehen:
CSearchSocket* sock = new CSearchSocket; sock->SetParent( this ); sock->Create(); CString sIpAddress = "192.168.100.", sIpTmp; CString peer; UINT port; for( int i=1; i<255; i++ ) { peer = ""; sIpTmp.Format( "%s%d", sIpAddress, i ); sock->sServerIp = sIpTmp; sock->Connect( sIpTmp, 4000 ); if( sock->GetPeerName( peer, port ) ) { m_serverlist.InsertString( 0, sIpTmp ); } } sock->Close(); return false;was auch nichts bringt
-
Nein!!!
Du scheinst nicht zu verstehen! Asynchron!
Connect wirft nur das Connecten an. Gleich nach Connect bist du noch nicht verbunden. Verbunden bist du in OnConnect. Dort kannst du dann die die IP holen.
Schau dir am Besten mal vorher ein Beispiel an wie man mit CAsyncSocket arbeitet.
In deiner for-Schleife wirfst du 254x das Connecten an - du bekommst dann auch 254 Benachrichtigungen in OnConnect (Ob Erfolgreich oder nicht)Oder nimm CSocket - dort kannst du das so machen (Solltest dann aber parallel mehrere Starten, also in mehreren Threads - da das sonst ewig dauert)!