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;

UdpPacketSizeと同じくらい多くのUDPデータをeネットワークデバイスから受信すると確信しています。

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 に答える