WSAETIMEDOUT Nachricht in Synapse-Bibliothek
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.
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.