Search code examples
delphiudpararat-synapse

WSAETIMEDOUT message in Synapse Library


Why I always get WSAETIMEDOUT error in this code :

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;

I'm sure that I receive UDP data from e network device as much as UdpPacketSize.


Solution

  • I solved my problem :)

    UDPSocket.Bind(UDPIP, UDPPort);
    

    must be

    UDPSocket.Bind('0.0.0.0', UDPPort);
    

    And

    if UDPSocket.LastError = 0 then
    

    must be

    if UDPSocket.LastError <> 0 then
    

    For to check IP address where data come from

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