代码之家  ›  专栏  ›  技术社区  ›  SimaWB

synapse库中的wsaetimedout消息

  •  0
  • SimaWB  · 技术社区  · 16 年前

    为什么此代码中总是出现wsaetimedout错误:

    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;
    

    我确信我从网络设备接收到的udp数据和udppacketsize一样多。

    3 回复  |  直到 16 年前
        1
  •  1
  •   mj2008    16 年前

    在调用“udpsocket.recvbufferex(@fudpbuf[1],udppacketsize,1000);”中,我假定最后一个数字是超时时间。这样做是为了不让它永远等待,而是定期检查线程是否已使用while循环条件终止。因此,对于这类代码,超时是一种正常情况,可以忽略。

        2
  •  1
  •   SimaWB    16 年前

    我解决了我的问题。)

    UDPSocket.Bind(UDPIP, UDPPort);
    

    必须是

    UDPSocket.Bind('0.0.0.0', UDPPort);
    

    if UDPSocket.LastError = 0 then
    

    必须是

    if UDPSocket.LastError <> 0 then
    

    用于检查数据来源的IP地址

    if UDPSocket.GetRemoteSinIP<>UDPIP then ....
    
        3
  •  0
  •   SimaWB    16 年前

    我发现了。错误在

    if UDPSocket.LastError = 0 then
    

    LastError is 10049=此时无法分配请求的地址。所以为什么我不能绑定udpip地址。我已经检查了IP和端口。这些是正确的。没有其他软件在监听这个端口。