Сообщение 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.
Решение 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 и порт.Это правильно.И никакого другого ПО, прослушивающего этот порт, нет.