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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top