为什么我总是在此代码中出现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;
我确信我从e网络设备接收的UDP数据与UdpPacketSize一样多。
答案 0 :(得分:1)
在调用“UDPSocket.RecvBufferEx(@fUDPBuf [1],UdpPacketSize,1000);”我认为最后一个数字是超时时间。这样做是为了使它不会永远等待,而是定期检查线程是否已使用while循环条件终止。因此,超时是这种代码的正常情况,可以忽略。
答案 1 :(得分:1)
我解决了我的问题:)
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 ....
答案 2 :(得分:0)
if UDPSocket.LastError = 0 then
LastError是10049 =此时无法分配请求的地址。那么为什么我无法绑定UDPIP地址。我检查了IP和端口。这些是正确的。并且没有其他软件在监听此端口。