求解UDP通信问题。Indy10中的TidUDPClient 与TidUDPServer 通信出错

sptlight 2013-03-11 08:16:27
在DELPHI EX2中,分别在两个应用中用了控件TidUDPClient 与TidUDPServer来实现信息的收发。实现在的功能是TidClient发信息后就收。客户端代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
GetBuff:TBytes;
lsstr:string;
begin
setlength(GetBuff,512);
zeromemory(GetBuff,512);

IdUDPClient1.Send('127.0.2.1',3030,'ewqefqwe312313');
IdUDPClient1.ReceiveBuffer(GetBuff);
end;


服务端代码如下:
procedure TForm1.IdUDPServer1UDPRead(AThread: TIdUDPListenerThread;
AData: TArray<System.Byte>; ABinding: TIdSocketHandle);
var
revbuff:array[0..99] of AnsiChar;
lsMsg:AnsiString;

begin
lsMsg:= BytesToString(AData);
Memo1.Lines.Add(lsMsg);

IdUDPServer1.Send(ABinding.PeerIP,ABinding.PeerPort,lsMsg);

end;

如果服务端下客户端都开启。通信正常。但如果服务端关闭,客户端就会报错:socket Error #10054 请问高手们,怎样不让客户端出错。也就是说,因为出错了,那TidUDPClient就一定知道服务端没有正常接收信息,在发送之前,怎样判断服务端没有开启或网络不通,从而决定发与不发信息。
...全文
368 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaocongzhi 2013-07-12
  • 打赏
  • 举报
回复
SIO_UDP_CONNRESET这个在Delphi中不知怎么定义,我想改写IdUDP控件,不知这个怎么定义
xiaocongzhi 2013-07-12
  • 打赏
  • 举报
回复
http://support.microsoft.com/kb/263823 这是微软的解释,还提供了解决方案 "下面的代码段演示可用于调用的方法与 SIO_UDP_CONNRESET 控件代码 WSAIoctl 以获取原始的 WindowsNT 4.0 行为。 DWORDdwBytesReturned = 0; BOOLbNewBehavior = FALSE; DWORDstatus; // disable new behavior using // IOCTL: SIO_UDP_CONNRESET status = WSAIoctl(sd, SIO_UDP_CONNRESET, &bNewBehavior, sizeof(bNewBehavior), NULL, 0, &dwBytesReturned, NULL, NULL); if (SOCKET_ERROR == status) { DWORD dwErr = WSAGetLastError(); if (WSAEWOULDBLOCK == dwErr) { // nothing to do return(FALSE); } else { printf("WSAIoctl(SIO_UDP_CONNRESET) Error: %d\n", dwErr); return(FALSE); } } 若要能够编译此代码,您需要既有最新的其中包括定义的 SIO_UDP_CONNRESET,或者插入下面的 Mswsock.h它的直接插入代码的定义。 // MS Transport Provider IOCTL to control // reporting PORT_UNREACHABLE messages // on UDP sockets via recv/WSARecv/etc. // Path TRUE in input buffer to enable (default if supported), // FALSE to disable. #defineSIO_UDP_CONNRESET_WSAIOW(IOC_VENDOR,12)
wylton 2013-03-15
  • 打赏
  • 举报
回复
无网络链接怎么发送? 你想过滤掉socket Error #10054 信息,用try...except...end拦截。

16,742

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧