题
为什么我总是得到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。
解决方案 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
LastError是10049 =不能分配请求的地址在这一点上。那么,为什么我不能绑定UDPIP地址。我已经检查IP和端口。这些都是正确的。而且也没有其他的软件监听此端口。
不隶属于 StackOverflow