Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 客户';s udpserver don';t反应_Delphi_Delphi 7_Indy - Fatal编程技术网

Delphi 客户';s udpserver don';t反应

Delphi 客户';s udpserver don';t反应,delphi,delphi-7,indy,Delphi,Delphi 7,Indy,我的服务器表单具有仅接受4个tcp连接用户的stringgride 为此,我将udpclient放在服务器中,将udpserver放在客户端中 在服务器形式的tcp onconnect事件中: //Server Side has udp client procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); begin //when fifth user want to connect to tcpserve

我的服务器表单具有仅接受4个tcp连接用户的stringgride 为此,我将udpclient放在服务器中,将udpserver放在客户端中

在服务器形式的tcp onconnect事件中:

   //Server Side has udp client
 procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin

      //when fifth user want to connect to tcpserver 
      //server first ensure at list one of the 4 connected user in grid has disconnected
      //by send udp broadcast to 4 user
      //but in this timeout None of these users do not respond , Although still connected

      IdUDPClient1.Broadcast('IP', 1718);
      For i:=1 To 4 Do
      begin
       IPList.Add(IdUDPClient1.ReceiveString(200););
      end;
end;


//Client Side has udp server
procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
    ABinding: TIdSocketHandle);
begin
 //
 ip:=GetipAddress();
 ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, ip[1], Length(ip));
end;
我在客户端运行ethereal来检查网络,看到udp消息从服务器发送到客户端,但客户端没有响应


请帮助我我的代码有什么问题

您的
TIdUDPServer.OnUDPRead
事件处理程序没有正确的签名,甚至没有关闭
TIdUDPServer
根本不使用
TIdPeerThread
,只有
TIdTCPServer
使用。您需要做更多类似的事情:

服务器:

procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread);
begin
  //when fifth user want to connect to tcpserver 
  //server first ensure at list one of the 4 connected user in grid has disconnected
  //by send udp broadcast to 4 user
  //but in this timeout None of these users do not respond , Although still connected

  IPList.Clear;
  IdUDPServer1.Broadcast('IP', 1718);
  Sleep(1000);
end;

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
  S: String;
begin
  if AData.Size > 0 then
  begin
    SetLength(S, AData.Size);
    AData.ReadBuffer(S[1], AData.Size);
    IPList.Add(S);
  end;
end;
客户:

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream; ABinding: TIdSocketHandle);
var
  S: String;
begin
  if AData.Size > 0 then
  begin
    SetLength(S, AData.Size);
    AData.ReadBuffer(S[1], AData.Size);
  end;
  if S = 'IP' then
  begin
    S := ABinding.IP;
    if (S = '') or (S = '0.0.0.0') then
      S := GStack.LocalAddress;
    ABinding.SendTo(ABinding.PeerIP, ABinding.PeerPort, S[1], Length(S));
  end;
end;

您没有显示接收UDP广播的客户端代码。但你为什么要使用UDP呢?TIdTCPServer有一个MaxConnections属性,您应该使用TCP keepalives/heartbeats来检测死掉的TCP客户端。我第一次使用TCP,但不起作用,我在onconnect事件tcpserver中使用tcpclient,但不起作用。它的编辑@RemyleBeau只是说“它不起作用”,这与您遇到的实际问题无关。如果您希望他人帮助您,您需要提供实际的详细信息。我使用tcp而不是udp,但出现错误,连接正常关闭,客户端不响应为什么您的服务器端有IdUDPServer1UDPRead,我的服务器端有udp客户端,客户端有UDPServer。我的意思是显示两边都在使用
TIdUDPServer
。对
TIdUDPClient
的引用是一个打字错误。我已经修好了。至于为什么服务器端使用
TIdUDPServer
,是因为客户端响应是异步的,
TIdUDPClient
不适合处理。因为UDP是无连接的,
TIdUDPServer
可以与另一个
TIdUDPServer
进行对话,这与TCP不同。我使用这个,但不回答,当服务器广播IdUDPServer1UDPRead客户端事件没有执行时,为什么?只有“IP”字保存在IPList中,为什么?广播可能不会通过网络进行,或者客户端不在同一子网上。使用Wireshark进行验证。服务器端
TIdUDPServer
正在接收自己的广播。我仍然建议您放弃UDP,改用TCP keepalives。