Socket Error probleem

Pagina: 1
Acties:

  • Griffin2k
  • Registratie: September 2000
  • Laatst online: 14-08 22:12
heb hiero een probleempje.. Hieronder de code... (Layout-verneukertje) :(

Maar het wordt gebruikt in een chat-applicatie in Visual C++...
Het probleem is dus dat de code altijd een socket-error genereerd zoals onderin de code staat..

Kan iemand mij misschien helpen hiermee? Doe ik iets fout?


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
DWORD WINAPI atlmgrSocketListenThread(LPVOID lpParam)
{
    ATLMgr      *pMgr = (ATLMgr *)lpParam;
    SOCKADDR_IN siClient;
    char        szBuffer[256];
    int         iLen, iRet;
    
    // Continue eternally
    for ( ;; )
    {
        // Wait for data from the client
        memset(szBuffer, 0, sizeof(szBuffer));
        iRet = recvfrom(pMgr->m_iListenSocket,      // Bound socket
                    szBuffer,               // Receive buffer
                    sizeof(szBuffer),       // Size of buffer in bytes
                    0,                      // Flags
                    (LPSOCKADDR)&siClient,  // Buffer to receive client address
                    &iLen);                 // Length of client address buffer
        
        // Check if connection has been closed
        if (iRet == 0)
            break;
        
        if (iRet != SOCKET_ERROR)
        {
            // Show that we've received some data
            char szTmp[256];
            sprintf(szTmp, "ATLMgr::SetupPortListener: Data received: %s", szBuffer);
            g_Output.OutputData(szTmp);
            
            
            // TODO: Determine which stream should receive this data
            //       For now we'll just pass it to all streams
            
            for (ConnList::iterator i = pMgr->m_Connections.begin(); i != pMgr->m_Connections.end(); ++i)
                i->pCallback((unsigned char *)szBuffer, strlen(szBuffer));
        }
        else
        {
            char szTmp[512], szErr[256];
            FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, WSAGetLastError(), 0, szErr, 256, NULL);
            sprintf(szTmp, "ATLMgr::SetupPortListener: Socket error: %s", szErr);
            g_Output.OutputData(szTmp);
            break;
        }
    }
    
    // Return success
    return 0;
}

Zonnepanelen 3950Wp - DMEGC 6x395Wp (ZW 2°) + DMEGC 4x395Wp (ZW 28°) - Solis 3.6 ; Easee Charge Lite 11kW + Easee Equalizer (Load Balancing) ; BMW iX1


  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Welke error geeft ie dan precies? en wat is je code om een naar eens socket te luisteren? (recvfrom, je listen-loop). lijkt me dat daar eerder de fout zit dan hier....

  • Griffin2k
  • Registratie: September 2000
  • Laatst online: 14-08 22:12
De error die hij output is: Het systeem heeft een ongeldig pointeradres gevonden

De luisterloop staat bovenin de code.. ook de recvfrom...

Zonnepanelen 3950Wp - DMEGC 6x395Wp (ZW 2°) + DMEGC 4x395Wp (ZW 28°) - Solis 3.6 ; Easee Charge Lite 11kW + Easee Equalizer (Load Balancing) ; BMW iX1


  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 21-06 17:10
misschien beetje overbodig: maar volgens mij floep je na de eerste keer alweer je "oneindige" loop uit... Als het fout gaat doe je namelijk een break, en als het goed gaat een return.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


  • Griffin2k
  • Registratie: September 2000
  • Laatst online: 14-08 22:12
Als het fout gaat dan wil ik juist dat die thread afgelopen is.. dus met een break.. als het goed gaat dan een return want dan blijft de thread lopen!

Dat zal niet zozeer het probleem zijn... hij heeft een ongeldig pointeradres gevonden.. dus een nullpointer denk ik... maar het probleem is dus waarvandaan..

Ik dnek zelf uit dit stukje, maar kan de fout niet ontdekken:

code:
1
2
3
4
5
6
7
8
9
// Wait for data from the client
        
memset(szBuffer, 0, sizeof(szBuffer));
iRet = recvfrom(pMgr->m_iListenSocket,      // Bound socket
                        szBuffer,           // Receive buffer
            sizeof(szBuffer),       // Size of buffer in bytes
            0,              // Flags
            (LPSOCKADDR)&siClient,                  // Buffer to receive client address
            &iLen);                     // Length of client address buffer

Zonnepanelen 3950Wp - DMEGC 6x395Wp (ZW 2°) + DMEGC 4x395Wp (ZW 28°) - Solis 3.6 ; Easee Charge Lite 11kW + Easee Equalizer (Load Balancing) ; BMW iX1


  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

'Als' het in dat stukje code zit, dan zou het die "pMgr->m_iListenSocket" moeten zijn, voor de rest is je recvfrom() goed.

Misschien zou je je iLen nog zo moeten initialiseren:

code:
1
iLen=sizeof(struct sockaddr);


Dit is wat generic code, zal ook wel voor Winsock werken.

[ Voor 47% gewijzigd door LAN op 03-04-2003 13:29 ]


  • Griffin2k
  • Registratie: September 2000
  • Laatst online: 14-08 22:12
LAN, IK HOU VAN JE!!!!!!!!!!!!!! :>

Ahumm... sorry whaha.... Hij werkt :D :9 8) _/-\o_

Dankjewel... _/-\o_ _/-\o_ _/-\o_

Zonnepanelen 3950Wp - DMEGC 6x395Wp (ZW 2°) + DMEGC 4x395Wp (ZW 28°) - Solis 3.6 ; Easee Charge Lite 11kW + Easee Equalizer (Load Balancing) ; BMW iX1


  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

Wow (: rustig aan.
Was het nou die initialisatie? Ik verwacht het haast van wel.


Als ik het zo zie dan gebruik je UDP, vanwege die recvfrom().
Maar... dat zegt helemaal niets, recvfrom kun je ook bij TCP gebruiken.

Mocht je nou wel TCP gebruiken (verstandig voor een chat omgeving), dan kun je misschien recv() nemen, werkt ietsje makkelijker.

[ Voor 70% gewijzigd door LAN op 03-04-2003 14:01 ]


  • Griffin2k
  • Registratie: September 2000
  • Laatst online: 14-08 22:12
Ja het was die initialisatie! en ja ik gebruik UDP ja!

Zou TCP wat makkelijker / beter zijn dan? want das een klein verschil in mijn code...

Zonnepanelen 3950Wp - DMEGC 6x395Wp (ZW 2°) + DMEGC 4x395Wp (ZW 28°) - Solis 3.6 ; Easee Charge Lite 11kW + Easee Equalizer (Load Balancing) ; BMW iX1


  • LAN
  • Registratie: Oktober 2000
  • Niet online

LAN

Als je UDP gebruikt zou iemand pakketten kunnen sturen naar je chat server met onjuiste gegevens (ander ip source adres bijvoorbeeld).
TCP maakt dit vrijwel onmogelijk. Het levert wel wat extra programmeerwerk op.

Moet je maar even kijken in hoeverre dit een belangrijk project is.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

LAN schreef op 03 April 2003 @ 14:09:
Als je UDP gebruikt zou iemand pakketten kunnen sturen naar je chat server met onjuiste gegevens (ander ip source adres bijvoorbeeld).
TCP maakt dit vrijwel onmogelijk. Het levert wel wat extra programmeerwerk op.

Moet je maar even kijken in hoeverre dit een belangrijk project is.
Met TCP kun je net zo hard de afzender faken als met UDP, en bij allebei is het net zo nutteloos naar een chat-applicatie (je krijgt nl. de responses dan niet terug).

Tevens levert TCP niet of nauwelijks meer programmeerwerk op (je moet een vlaggetje omzetten), meestal juist minder! Clue is dat TCP een Controller protocol is met ingebouwde sequencing, acking en checksumming, 3 dingen die UDP niet native heeft. De eerste zorgt ervoor dat je de pakketjes in dezelfde volgorde binnenkrijgt als dat ze verstuurd zijn, de 2e zorgt ervoor dat alle pakketjes opnieuw verstuurd worden als ze niet binnen x tijd ontvangen zijn, en de 3e zorgt ervoor dat je data niet kan corrupten onderweg. Het gebrek aan sequencing zorgt er tevens voor dat een UDP pakket max. 480 bytes mag zijn terwijl je over TCP kunt streamen wat je maar wilt.

Het grote beslissingspunt is de netwerk- en CPU-loads. UDP is lightweight fire-and-forget werk, en om die reden wordt het gebruikt voor vaak uitgevoerde tasks met weinig data (DNS werkt normaliter via UDP). TCP is voor datahongerige applicaties met dikke(re) CPU's.

Ter vergelijking: MSN Messenger heeft een enorm ultra-phat TCP protocol. ICQ werkt via UDP (vandaar in oudere versies de messagelimiet van ~400 bytes). ICQ deed echter altijd al uitgebreid zelf voor acking, sequencing en checksumming zorgen, beetje overbodig dus.

Professionele website nodig?

Pagina: 1