Synapse 라이브러리의 WSAETIMEDOUT 메시지
문제
이 코드에서 항상 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와 포트를 확인합니다. 이것들은 정확합니다. 그리고이 포트를 듣는 다른 소프트웨어는 없습니다.
제휴하지 않습니다 StackOverflow