0

为什么我总是在这段代码中得到 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;

我确信我从 e 网络设备接收的 UDP 数据与 UdpPacketSize 一样多。

4

3 回答 3

1

在调用“UDPSocket.RecvBufferEx(@fUDPBuf[1], UdpPacketSize, 1000);” 我假设最后一个数字是超时时间。这样做是为了它不会永远等待,而是定期检查线程是否已使用 while 循环条件终止。所以超时是这类代码的正常情况,可以忽略。

于 2009-02-05T13:33:19.593 回答
1

我解决了我的问题:)

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 ....
于 2009-02-07T11:30:00.090 回答
0

我找到。错误在

if UDPSocket.LastError = 0 then

LastError 为 10049=此时无法分配请求的地址。那么为什么我不能绑定UDPIP地址。我检查了IP和端口。这些都是正确的。并且没有其他软件监听这个端口。

于 2009-02-05T16:21:18.957 回答