質問

なぜ私はいつもこのコードで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データを受信することを確信してます。

役に立ちましたか?

解決 2

私は私の問題を解決しました:)

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 ....

他のヒント

コール "UDPSocket.RecvBufferEx(@fUDPBuf [1]、UdpPacketSize、1000);" で私は、最後の番号がタイムアウト期間であることを前提とします。これは、それが永遠に待って座ってしないように行われますが、スレッドがwhileループの条件を使用して終了した場合ではなく、定期的にチェックしています。だから、タイムアウトは、コードのこの種の通常の状況で、無視することができます。

私はそれを発見しました。エラーがである

if UDPSocket.LastError = 0 then

最終エラーは、この時点で要求されたアドレスを割り当てることができません= 10049です。なぜ私はUDPIPアドレスをバインドできませんでした。私は、IPとポートを確認しました。これらは正しいです。そして、このポートをリッスンし、他のソフトウェアはありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top