Сообщение WSAETIMEDOUT в библиотеке Synapse

Почему я всегда получаю ошибку 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.


person SimaWB    schedule 05.02.2009    source источник


Ответы (3)


В вызове «UDPSocket.RecvBufferEx(@fUDPBuf[1], UdpPacketSize, 1000);» Я бы предположил, что последнее число - это период ожидания. Это сделано для того, чтобы он не сидел в ожидании вечно, а периодически проверял, был ли поток завершен, используя условие цикла while. Таким образом, тайм-аут является нормальной ситуацией для такого кода и может быть проигнорирован.

person mj2008    schedule 05.02.2009
comment
в любом случае, мои коды в цикле while не завершены. И я уверен, что получил 1305 байт каждые 5 миллисекунд. - person SimaWB; 05.02.2009
comment
в любом случае, мои коды в цикле while не завершены. - да, это тест, чтобы увидеть, было ли оно прекращено. Не существует естественно. Что касается времени, возможно, уведомление сокета о данных не пришло из-за занятости системы, и это время ожидания истекло. - person mj2008; 05.02.2009

Я решил свою проблему :)

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 ....
person SimaWB    schedule 07.02.2009

Я нашел это. Ошибка в

if UDPSocket.LastError = 0 then

LastError is 10049=Невозможно назначить запрошенный адрес в данный момент. Итак, почему я не мог привязать адрес UDPIP. Я проверил IP и порт. Это правильно. И нет никакого другого программного обеспечения, прослушивающего этот порт.

person SimaWB    schedule 05.02.2009