Domanda

Perché ottengo sempre l'errore WSAETIMEDOUT in questo codice:

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;

Sono sicuro che ricevo i dati UDP da dispositivo e di rete il più UdpPacketSize.

È stato utile?

Soluzione 2

ho risolto il mio problema:)

UDPSocket.Bind(UDPIP, UDPPort);

deve essere

UDPSocket.Bind('0.0.0.0', UDPPort);

E

if UDPSocket.LastError = 0 then

deve essere

if UDPSocket.LastError <> 0 then

Per controllare l'indirizzo IP in cui i dati provengono da

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

Altri suggerimenti

Nella chiamata "UDPSocket.RecvBufferEx (@fUDPBuf [1], UdpPacketSize, 1000);" Vorrei Presumo che l'ultimo numero è il periodo di timeout. Questo è fatto in modo che non si siede in attesa per sempre, ma piuttosto controlla periodicamente se il thread è stato terminato con la condizione del ciclo, mentre. Così il timeout è una situazione normale per questo tipo di codice, e può essere ignorato.

ho scoperto che. L'errore è in

if UDPSocket.LastError = 0 then

LastError è 10049 = Impossibile assegnare richiesta indirizzo a questo punto. Allora, perché non ho potuto associare l'indirizzo UDPIP. Ho controllare l'IP e la porta. Questi sono corrette. E non c'è nessun altro software ad ascoltare questa porta.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top