0

サーバー フォームには、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;

クライアントでイーサリアルを実行してネットワークをチェックしたところ、UDP メッセージがサーバーからクライアントに送信されましたが、クライアントが応答しませんでした。

コードの問題を教えてください

4

1 に答える 1

1

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;
于 2013-05-15T17:25:08.260 に答える