Pergunta

Por que eu sempre recebo erro WSAETIMEDOUT neste código:

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;

Eu tenho certeza que eu receber dados UDP do dispositivo e de rede, tanto quanto UdpPacketSize.

Foi útil?

Solução 2

Eu resolvi meu problema:)

UDPSocket.Bind(UDPIP, UDPPort);

deve ser

UDPSocket.Bind('0.0.0.0', UDPPort);

E

if UDPSocket.LastError = 0 then

deve ser

if UDPSocket.LastError <> 0 then

Para verificar o endereço IP onde os dados vêm de

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

Outras dicas

Na chamada "UDPSocket.RecvBufferEx (@fUDPBuf [1], UdpPacketSize, 1000);" Eu presumo que o último número é o período de tempo limite. Isto é feito para que ele não se senta à espera para sempre, mas verifica periodicamente se o thread foi encerrado com a condição de loop while. Portanto, o tempo limite é uma situação normal para este tipo de código, e pode ser ignorado.

Eu encontrei isso. O erro está em

if UDPSocket.LastError = 0 then

LastError é 10049 = Não é possível atribuir endereço solicitado neste momento. Então, por que eu não poderia vincular o endereço UDPIP. Tenho verificar o IP e porta. Estes são corretas. E não há outro software escutar esta porta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top