Frage

Warum ich immer WSAETIMEDOUT Fehler in diesem Code erhalten:

var fUDPBuf: array [1..UdpPacketSize] of byte;
{...}
UDPSocket := TUDPBlockSocket.Create;
UDPSocket.Bind(UDPIP, UDPPort);
if UDPSocket.LastError = 0 then
  Raise EDevFail.Create(Format(SPortFailed, [UDPPort]));

while not Terminated do begin
  BytesRead := UDPSocket.RecvBufferEx(@fUDPBuf[1], UdpPacketSize, 1000);
  if BytesRead <= 0 then
    case UDPSocket.LastError of
      0, WSAETIMEDOUT: Continue;
      WSAECONNRESET, WSAENETRESET,
      WSAENOTCONN, WSAECONNABORTED,
      WSAENETDOWN: begin
                     Raise EDevFail.Create(UDPSocket.GetErrorDesc(UDPSocket.LastError));
                     UDPSocket.CloseSocket;
                   end;
      else begin
        Raise EDevFail.Create(UDPSocket.GetErrorDesc(UDPSocket.LastError));
        UDPSocket.CloseSocket;
      end;
    end;

  //Sleep(1);
  ProcessData(@fUDPBuf[1]);
  inc(PacketCount);
end;

Ich bin sicher, dass ich UDP-Daten von E Netzwerkgerät so viel wie UdpPacketSize erhalten.

War es hilfreich?

Lösung 2

ich mein Problem gelöst:)

UDPSocket.Bind(UDPIP, UDPPort);

muss

UDPSocket.Bind('0.0.0.0', UDPPort);

Und

if UDPSocket.LastError = 0 then

muss

if UDPSocket.LastError <> 0 then

Für die IP-Adresse zu überprüfen, wo Daten stammen aus

if UDPSocket.GetRemoteSinIP<>UDPIP then ....

Andere Tipps

In dem Aufruf "UDPSocket.RecvBufferEx (@fUDPBuf [1], UdpPacketSize, 1000);" Ich würde davon ausgehen, dass die letzte Zahl die Timeout-Zeit ist. Dies wird so getan, dass es nicht sitzt nicht ewig warten, sondern überprüft periodisch, ob der Thread des while-Schleife Zustand beendet wurde verwendet. Also das Timeout ist eine normale Situation für diese Art von Code und kann ignoriert werden.

Ich fand, dass. Der Fehler ist in

if UDPSocket.LastError = 0 then

LetzteFehlerNr ist 10049 = Kann Adresse an dieser Stelle angefordert zuordnen. Warum also konnte ich nicht die UDPIP Adresse binden. Ich habe die IP und Port überprüfen. Dies sind korrekt. Und es gibt keine andere Software diesen Port zu hören.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top