mensagem WSAETIMEDOUT em Synapse Biblioteca
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.
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.