在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就一定知道服务端没有正常接收信息,在发送之前,怎样判断服务端没有开启或网络不通,从而决定发与不发信息。
 delphi socketindyTidUDPClientUDP通信

解决方案 »

  1.   

    无网络链接怎么发送?
    你想过滤掉socket Error #10054 信息,用try...except...end拦截。
      

  2.   

    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)
      

  3.   

    SIO_UDP_CONNRESET这个在Delphi中不知怎么定义,我想改写IdUDP控件,不知这个怎么定义