Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Socket Aufbau nach unbekannter Adresse

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 <
000
06.10.2004, 14:53 Uhr
~Sunligth
Gast


ich habe ein Programm zur automatische Erkennung von Clients via Ethernet vor.
Einen IP Scanner hab ich zwar schon, aber leider ist der echt langsam.
Habe den gleichen Code auf Linux in 1000x Geschwindigkeit am laufen. Denke es liegt an einem Timeout oder so.

Wer kann mir sagen, wie ich den Socket einstellen muß, damit das schneller geht.
Es geht halt um den Versuch einen Socket aufzubauen, der vielleicht fehlschlägt. Das dauert aber recht lange, sollte doch verkürzbar sein.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.10.2004, 13:15 Uhr
~KINK_LEO_III
Gast



C++:
/// CSocket modify - timeout module.
BOOL CSock::ConnectHelper(const SOCKADDR* lpSockAddr, int nSockAddrLen)
{
    if (m_pbBlocking != NULL)
    {
        WSASetLastError(WSAEINPROGRESS);
        return  FALSE;
    }

    m_nConnectError = -1;

    if (!CAsyncSocket::ConnectHelper(lpSockAddr, nSockAddrLen))
    {
        if (GetLastError() == WSAEWOULDBLOCK)
        {
    // Insert....
            CTime        curt, st;
            CTimeSpan    span(0, 0, 0, m_nTimeOut);

            st = CTime().GetCurrentTime();
    //.......
            while (PumpMessages(FD_CONNECT))
            {
                if (m_nConnectError != -1)
                {
                    WSASetLastError(m_nConnectError);
                    return (m_nConnectError == 0);
                }
    // Insert....
                curt = CTime().GetCurrentTime();
                if(curt > (st+span))
                    return FALSE;
    //..............
            }
        }
        return FALSE;
    }
    m_Kill = FALSE;
    return TRUE;
}



www.codeguru.com/Cpp/I-N/internet/network/article.php/c3397/

Dieser Post wurde am 12.10.2004 um 15:27 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.10.2004, 15:28 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


du musst m_nTimeout kürzer setzen
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.10.2004, 12:52 Uhr
~Sunlight
Gast


erstmal danke für beide Vorschläge.

Den von FloSogft finde ich interessanter, weil kürzer erscheint.

Wie genau benutze ich denn aber m_nTimeout ?
Von wo kommt die VAR?
Im MSDN hab ich sie leider nicht gefunden und einfaches setzen wollte er Compiler nicht durchgehen lassen, weil ihm unbekannt.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.10.2004, 18:00 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


hmm ok, ich hab mich auf das von LeoIII bezogen
hab übersehen das der nicht von dir kam
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.10.2004, 13:57 Uhr
~Sunlight
Gast


Also die Sache, die ihr oben beschrieben habt ist mir klar. Nun habe ich aber die Sache mit CAsynchSocket programmiert und nicht mit CSocket
(Sorry-hatte ich vergessen zu schreiben)

Wißt ihr vielleicht auch wie das hier geht?


C++:
...
struct sockaddr_in addr;
    short port = 4000;                        //scan on Port 4000
    int s;
    unsigned long IPaddress;

//WinSocket Init
    WSAInit();

    s = socket(PF_INET, SOCK_STREAM, 0);
    if (s == -1)
    {
        AfxMessageBox("socket() failed");
        return;
    }
    
    IPaddress = ntohl(inet_addr(IP));        //generating IP Address

    addr.sin_addr.s_addr = htonl(IPaddress);
    addr.sin_port = htons(port);
    addr.sin_family = AF_INET;

    //connect and action...
    if (!connect(s, (struct sockaddr*)&addr, sizeof(addr)))        //success!
    {
        //add IP to LIST-FIELD
        //Listenfeld holen
        UpdateData(TRUE);

        //IP in Liste aufnehmen (Listenfeld)
        m_ctlipliste.AddString(IP);

        //IP in Liste aufnehmen (IP_struct_Liste)
        LCU_IPS[lcu_ip_counter].IP = IP;
        LCU_IPS[lcu_ip_counter].LCUNo = -1;

        //LCU_IPS.IP = IP;
        AfxMessageBox(LCU_IPS[lcu_ip_counter].IP);
        
        //increment counter
        lcu_ip_counter++;

        //Listenfeld setzen
        UpdateData(FALSE);
    }
    //close socket!
    closesocket(s);
    //WinSock Cleanup
    WSACleanup();

    return;
}

void IPScanner::WSAInit()
{
    WORD wVersionReg = MAKEWORD(2, 0);      // WSA-Version 2.0
    WSADATA wsaData;
    int err;
    if (err = WSAStartup(wVersionReg, &wsaData) != 0)
    {
        AfxMessageBox("Fehler: Initialisieren - WinSock.dll!");
    }
}

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.10.2004, 16:46 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


man muss das socket auf non-blocking setzen mit setsockopt und dann mit select (siehe foren-suche) schaun ob connection angekommen oder nicht
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
22.10.2004, 14:57 Uhr
~Sunligth
Gast


das hab ich auch schon gelesen, aber nicht so ganz verstanden.
Weißt du darüber genauer Bescheid? Könntest du mir vielleicht konkret sagen wo ich was wie setzen muß?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
22.10.2004, 15:32 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


Hmm war nicht setsockopt, unter win ists glaub ich ioctlsocket, unter linux einfach nur ioctl oder so.

d.h so


C++:
u_long v = 1; // v > 0 non blocking, v = 0 blocking
ioctlsocket(sock,IONBIO,&v);
//connect(...) // sollte er dann direkt "drüberspringen und nicht warten bis abgewiesen o.ä)



dann


C++:
fd_set conn;
struct timeval timeout;
timeout.tv_sec = 5; // 5 Sekunden Timeout
timeout.tv_usec = 0;

FD_ZERO( &conn );
FD_SET( sock, &conn );


int s = select( ((int)sock + 1), NULL, &conn, NULL, &timeout ); // das +1 ist wichtig, frag mich nicht wieso
if( s > 0 )
{
  // verbindung ist da, socket ist writeable!
}




Zitat:

The parameter writefds identifies the sockets that are to be checked for writability. If a socket is processing a connect call (nonblocking), a socket is writeable if the connection establishment successfully completes. If the socket is not processing a connect call, writability means a send, sendto, or WSASendto are guaranteed to succeed. However, they can block on a blocking socket if the len parameter exceeds the amount of outgoing system buffer space available. It is not specified how long these guarantees can be assumed to be valid, particularly in a multithreaded environment.


--
class God : public ChuckNorris { };

Dieser Post wurde am 22.10.2004 um 15:33 Uhr von FloSoft editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: