문제

이 코드에서 항상 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만큼 E 네트워크 장치에서 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], udpppacketsize, 1000);" 마지막 숫자는 시간 초과 기간이라고 가정합니다. 이것은 영원히 기다리지 않고 while 루프 조건을 사용하여 스레드가 종료 된 경우 정기적으로 확인하도록 수행됩니다. 따라서 타임 아웃은 이러한 종류의 코드의 정상적인 상황이며 무시할 수 있습니다.

나는 그것을 발견했다. 오류가 발생합니다

if UDPSocket.LastError = 0 then

Lasterror는 10049입니다.이 시점에서 요청 된 주소를 할당 할 수 없습니다. 그래서 왜 UDPIP 주소를 바인딩 할 수 없었습니다. IP와 포트를 확인합니다. 이것들은 정확합니다. 그리고이 포트를 듣는 다른 소프트웨어는 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top