Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Fehler bei Casyncsocket?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ]
000
05.08.2002, 19:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hallo,
ich versuche wie folgt eine Verbindung herzustellen:


C++:
CAsyncSocket m_asTonline;

// WsaStartup etc ist in InitInstance

if(!m_asTonline.Create(0,SOCK_STREAM,FD_READ|FD_WRITE|FD_CONNECT|FD_CLOSE))
    AddStatus("Error %5d: m_asTonline can't create Socket",m_asTonline.GetLastError());
else
    AddStatus("Success    : m_asTonline successfully created Socket");

if(!m_asTonline.Connect("draveland.dnsalias.com",2593))
    AddStatus("Error %5d: m_asTonline can't connect to \"draveland.dnsalias.com:2593\"",m_asTonline.GetLastError());
else
    AddStatus("Success    : m_asTonline successfully connected");



(AddStatus ist eine Memberfunktion welche mir den Text zu einer Listbox hinzufügt und auswählt)

Bei dem Createaufruf kommt Success, bei dem Connect Aufruf aber 10038! Wieso ist die Adresse nicht ok?

In der MSDN steht drin das man auch z.B. ftp.microsoft.com gehen soll, er also den DNS-Eintrag automatisch holt! Das Problem ist, das die IP zu dem Hostname sich täglich ändert! Wie muss ich es aufrufen das es geht?

Wie kann man die Adresse in eine IP auflösen lassen? bei gethostbyname blick ich heut nix mehr ...
--
class God : public ChuckNorris { };

Dieser Post wurde am 05.08.2002 um 19:33 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
05.08.2002, 20:11 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Wenn ich die IP manuell angeb, kanner eine verbindung herstellen, nach firewall hat mein programm was empfangen, er ist aber nie in die OnReceive gesprungen...

Hab ich da irgendwie falsch überladen?


C++:
class CLocalSocket : public CAsyncSocket
{
public:
    CLocalSocket();
    virtual ~CLocalSocket();

protected:
    virtual void OnReceive(int nErrorCode);
//...
};



oder ist ein Fehler in meiner OnReceive-Funktion?


C++:
void CLocalSocket::OnReceive(int nErrorCode)
{
    CString strReceive;
    char buf[3];
    int get = 0;
    do
    {
        get = CAsyncSocket::Receive(buf,2,0);
        strReceive+=_T(buf);
    }
    while(get>0);

    if(!strReceive.IsEmpty())
    {
        CString strStatus;
        strStatus.Format("Receiving Local: \"%s\"",strReceive);
        SendMessage(AfxGetMainWnd()->m_hWnd,WM_ADDSTATUS,(WPARAM)strStatus.GetBuffer(strStatus.GetLength()),0);
        SendMessage(AfxGetMainWnd()->m_hWnd,WM_SEND2TONLINE,(WPARAM)strStatus.GetBuffer(strStatus.GetLength()),0);
        strStatus.ReleaseBuffer();
    }
  CAsyncSocket::OnReceive(nErrorCode);
}



Ich hab das erste Socket (von dem ich angeblich was empfangen haben sollte) mit


C++:
m_asLocal.Create(2593,SOCK_STREAM,FD_READ|FD_WRITE|FD_ACCEPT|FD_CLOSE,"192.254.0.1");



aufgerufen!

Ist da irgendwas falsch warum er nicht meine OnReceive benutzt?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
05.08.2002, 21:37 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Flo,
Nehme an, du hast den Socket initalisiert.
Ich bin mir fast sicher das der Error 10038 Dir sagt, dass du reinitialisierst ohne vorher geschlossen zu haben. Ich hab das mal über Port 80 wie folgt probiert.

C++:
if(!m_asTonline.Connect("www.yahoo.com",80))


Es hat eigentlich keine Fehler geworfen.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
05.08.2002, 21:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hmm seltsam ...

ich hab halt vorher Create aufgerufen, aber ohne Adresse.

Das seltsame ist ja wenn ich die Ip angebe kommt 10035, das liegt aber an meinem firewall das er verzögert, funktionieren tut das dann schon,

Ich versteh nur nicht das er mir nie in OnReceive geht obwohl mein Firewall sagt er hat 66bytes übertragen ... Diese Bytes sind leider wichtig, da das alles sonst nicht funktioniert was ich vor habe.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.08.2002, 22:09 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Ich weiß nun was ich falsch gemacht habe,

habe das Socket mit


C++:
Create(0,...



aufgerufen, man muss aber einen Port spezifizieren. Dann funktioniert es.

Nur das Problem mit dem Receive ist immernoch vorhanden
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
05.08.2002, 23:06 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo Flo,
Da kann es eigentlich nur eine Möglichkeit geben, Du bist nicht Verbunden!
Connect kehrt erst zurück wenn entweder ein Fehler auftritt oder eine Verbindung besteht. Was Du jedoch probieren kannst, ist mal Deine Flags auf 0 zu setzen und dann nochmals initialisieren.
err=m_asTonline.AsyncSelect(0);
err=m_asTonline.AsyncSelect(FD_READ|FD_WRITE|FD_ACCEPT|FD_CLOSE);
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe

Dieser Post wurde am 05.08.2002 um 23:31 Uhr von Uwe editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
06.08.2002, 07:19 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hmm das hat auch nicht funktioniert, das seltsame ist auch in der Funktion OnAccept. welche sogar aufgerufen wird wenn mein 2ter rechner connected kommt bei GetPeerName nichts raus, nur:

"Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und (b..."

Ich dachte in OnAccept ist das Socket schon verbunden?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
06.08.2002, 07:35 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Man ich bin doch zu blöd! Ich hab in OnAccept nicht Accept aufgerufen, sondern OnAccept der Basisklasse, und die ist natürlich leer!

Ich hab nun 3Sockets, beim dritten bekomme ich auch daten auf onreceive (das dritte ist das welches ich bei Accept übergebe)

Nur: GetPeerName auf dem Socket gibt trotzdem wieder error
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
06.08.2002, 08:26 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hab nun auch hier das Problem gefunden:

in dem ReceiveBuffer ist folgendes drin:

0: -64
1: -2
2: 0 <-- das hier ist das Problem:
4: 3
5: 0
.
.
.

Das Programm sendet binärstrings die \0 enthalten können! Wie kann man diese Strings einlesen, ohne das er das abschneidet?
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
06.08.2002, 13:56 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hmm,
hab es zwar etz geschafft das es einigermaßen funktioniert,
es gibt trotzdem noch Probleme:

Es kommt immer beim Connect 10035 raus, d.h.


Zitat:

WSAEWOULDBLOCK The socket is marked as nonblocking and the connection cannot be completed immediately.



Manchmal connected er, manchmal eben nicht (obwohl jedesmal 10035 kommt) wie kann man nachprüfen ob auch wirklich connected ist?

Im Moment funktioniert es etwa in 4 von 10 Versuchen! Das ist mir zu wenig!
Am liebsten wären mir 10 von 10, mit 8 wär ich aber auch schon zufrieden

Immer wenn er die Verbindung nicht herstellen will/kann, dann sendet er mir die Pakete zum A... der Welt. Wie kann ich sichersein, das die Pakete erst gesendet werden, wenn wirklich eine Verbindung hergestellt ist?
--
class God : public ChuckNorris { };

Dieser Post wurde am 06.08.2002 um 14:33 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: