Question

Pourquoi je reçois toujours l'erreur de WSAETIMEDOUT dans ce code:

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;

Je suis sûr que je reçois des données UDP à partir du périphérique de réseau e autant que UdpPacketSize.

Était-ce utile?

La solution 2

I solved my problem :)

UDPSocket.Bind(UDPIP, UDPPort);

must be

UDPSocket.Bind('0.0.0.0', UDPPort);

And

if UDPSocket.LastError = 0 then

must be

if UDPSocket.LastError <> 0 then

For to check IP address where data come from

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

Autres conseils

Dans l'appel "UDPSocket.RecvBufferEx (@fUDPBuf [1], UdpPacketSize, 1000);" Je présume que le dernier numéro est le délai d'attente. Ceci est fait pour qu'il ne siège pas attendre pour toujours, mais vérifie plutôt périodiquement si le fil a été résiliés en utilisant la condition de boucle while. Ainsi, le délai d'attente est une situation normale pour ce type de code, et peut être ignoré.

I found that. The error is in

if UDPSocket.LastError = 0 then

LastError is 10049=Can't assign requested address at this point. So why I couldn't Bind the UDPIP address. I've check the IP and Port. These are correct. And there is no other software listening this port.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top