Forum: PC-Programmierung Receive UDP - Thread verzögert Empfang?


von Andy (Gast)


Lesenswert?

Hallo zusammen,

ich schreibe gerade eine kleines Programm (VC++), wo kleine Datenpakete 
(<100Bytes) via UDP vom Netzwerk empfangen werden. Gesendet werden diese 
mit einer anderen Applikation vom gleichen PC.
Soweit funktionert alles prima. Nur fällt auf, das es nach dem Drücken 
des Sendebuttons ca. 1-2 Sekunden dauert, bis die Daten von meinem 
Programm empfangen werden.
Testweise habe ich ReceiveData() mal ohne Thread in einer Endlosschleife 
aufgerufen, was mein Programm wegen der blockenden CSocket-Funktion 
ReceiveFrom()  natürlich total blockiert, aber oha - da empfange ich die 
Daten wirklich unmittelbar nach dem Senden.
Kann mir jemand einen sachdienlichen Hinweis geben, was das Problem ist 
bzw. wie ich den Empfang mit Thread "beschleunigen" kann? Ein Änderung 
der Threadpriorität führte leider nicht zum Ziel.

MFG
Andy
1
/*********************************
2
**********************************/
3
void MyEthernet::StartRXThread()
4
{  
5
  mh_Thread=CreateThread(0, 0, WaitForRxThreadfunction, this, 0, &u32_ID);
6
}
7
8
9
/***************************************************************
10
****************************************************************/
11
ULONG WINAPI MyEthernet::WaitForRxThreadfunction(LPVOID pParam) 
12
 {   
13
  MyEthernet* pETH = (MyEthernet*) pParam; 
14
   
15
  pETH->m_bThreadIsStarted = true;          
16
     
17
  while(pETH->m_bThreadIsStarted)
18
  {    
19
    pETH->ReceiveData(); //loop is executed until [close] button is pressed
20
  }
21
22
  CloseHandle(pETH->mh_Thread);
23
24
   return 0; 
25
 } 
26
27
28
/*********************************
29
**********************************/
30
void MyEthernet::ReceiveData()
31
{  
32
    // Client address
33
    SOCKADDR_IN echoClntAddr; 
34
35
    // Set the size of the in-out parameter
36
    int clntAddrLen = sizeof(echoClntAddr);
37
38
    // Block until receive message from a client
39
    recvMsgSize = echoServer.ReceiveFrom(echoBuffer, 128, (SOCKADDR*)&echoClntAddr, &clntAddrLen, 0);
40
    if (recvMsgSize > 0) 
41
    {     
42
      SendMessageW(m_hwndParent,WM_ETHERNET_RX, 0,0);
43
    }    
44
    else
45
    {  
46
      AfxMessageBox(TEXT("RecvFrom() failed"));
47
    }
48
}

von Pandur S. (jetztnicht)


Lesenswert?

Wenn man
recvMsgSize = echoServer.ReceiveFrom(echoBuffer, 128, 
(SOCKADDR*)&echoClntAddr, &clntAddrLen, 0);

Auf groesse Null der Meldung testen muss, nennt sich das Pollen.

Vergiss da mal. Da muss ein Event hin.

von Jim M. (turboj)


Lesenswert?

Eventuell liegt das Problem gar nicht in ReceiveFrom(), sondern in 
SendMessageW().

Denn SendMessage packt ja nur eine Message an Ende der Queue und wartet 
bis die abgearbeitet wurde.

Wir sehen hier nicht was Dein m_hwndParent sonst noch so alles tut...

Zitronen F. schrieb:
> Auf groesse Null der Meldung testen muss, nennt sich das Pollen.

Nur wenn man den Socket auf nicht-blockierend gestellt hat. Ansonsten 
ist das defensive Programmierung.

von Andy (Gast)


Lesenswert?

Hallo zusammen,

ich bin jetzt nicht der Programmierexperte - das mal vorweg.

@Jim - Bei dem oben erwähnten Test ohne Thread war das Handling mit 
SendMessageW identisch, weswegen ich das als Ursache eigentlich 
ausgeschlossen hatte, falls Du das meintest...oder habe ich Deine 
Anmerkung falsch interpretiert?

@Zitronen - mir war diese simple Lösung am sympathischsten, so als 
Gelegenheitsprogrammierer :-) Wenn ich hier nicht weiterkomme, werde ich 
mal nach eventgetriebenen Beispielen suchen müssen.


MFG
Andy

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.