2009-02-05 11 views
0

Pourquoi je reçois toujours l'erreur de WSAETIMEDOUT dans ce code:message WSAETIMEDOUT dans la bibliothèque Synapse

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.

Répondre

1

Je résolu mon problème :)

UDPSocket.Bind(UDPIP, UDPPort); 

doit être

UDPSocket.Bind('0.0.0.0', UDPPort); 

Et

if UDPSocket.LastError = 0 then 

doit être

if UDPSocket.LastError <> 0 then 

Pour vérifier l'adresse IP d'où proviennent les données

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

Dans l'appel "UDPSocket.RecvBufferEx (@fUDPBuf [1], UdpPacketSize, 1000);" Je présume que le dernier nombre est la période d'expiration. Ceci est fait de sorte qu'il n'attend pas pour toujours, mais vérifie plutôt périodiquement si le fil a été terminé en utilisant la condition de boucle while. Donc, le timeout est une situation normale pour ce genre de code, et peut être ignoré.

+0

de toute façon mes codes dans la boucle "while Noninated". Et je suis sûr que j'ai reçu 1305 octets toutes les 5 millisecondes. – SimaWB

+0

"de toute façon mes codes dans" tout ne pas Terminé "boucle". - Oui, c'est le test pour voir s'il a été terminé. Le Non est naturellement là. En ce qui concerne la synchronisation, il est possible que la notification de données de socket ne soit pas arrivée à cause du système occupé, et que cette attente expire. – mj2008

0

J'ai trouvé que. L'erreur est dans

if UDPSocket.LastError = 0 then 

LastError est 10049 = Impossible d'affecter l'adresse demandée à ce stade. Alors pourquoi je ne pouvais pas lier l'adresse UDPIP. J'ai vérifié l'adresse IP et le port. Ce sont corrects. Et il n'y a pas d'autre logiciel écoutant ce port.