WSAETIMEDOUT mensaje en la sinapsis Biblioteca
Pregunta
¿Por qué siempre me sale error WSAETIMEDOUT en este 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;
Estoy seguro de que recibo de datos UDP de dispositivo de red de correo tanto como UdpPacketSize.
Solución 2
He resuelto mi problema:)
UDPSocket.Bind(UDPIP, UDPPort);
debe ser
UDPSocket.Bind('0.0.0.0', UDPPort);
y
if UDPSocket.LastError = 0 then
debe ser
if UDPSocket.LastError <> 0 then
Para comprobar la dirección IP en que los datos provienen de
if UDPSocket.GetRemoteSinIP<>UDPIP then ....
Otros consejos
En la llamada "UDPSocket.RecvBufferEx (@fUDPBuf [1], UdpPacketSize, 1000);" Me supongo que el último número es el período de tiempo de espera. Esto se hace para que no se sienta esperando para siempre, sino que comprueba periódicamente si el mensaje ha sido terminado utilizando la condición de bucle while. Por lo que el tiempo de espera es una situación normal para este tipo de código, y puede ser ignorada.
He descubierto que. El error es en
if UDPSocket.LastError = 0 then
LastError es 10049 = No se puede asignar la dirección solicitada en este punto. Así que por qué no podía conectar la dirección UDPIP. Tengo comprobar la IP y el puerto. Estos son correctos. Y no hay otro software de escuchar este puerto.