Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Как создать UDP Server


Автор: fippo 28.11.2008, 13:08
Подскажите, как можно создать UDP Server, с возможностью отправки сообщений клиентам? Поставил IDudpServer, он сообщения принимает, а как с помощью него отправлять сообщения подключенным клиентам? Воткнул IDudpClient, с помощью него получается отправлять, но проблема в том, что это работает только в локальной сети. При попытке отправить с пом. IDudpClient за нат ничё не выходит.
Игровые сервера как-то отправляют сообщения клиентам без внешних IP, вот мне интересно, как такое возможно, и как это реализовать средствами delpi?

Автор: darkmamba 28.11.2008, 13:14
Это на Indy фэйк CS сервера smile 

udp.Binding.PeerIP и udp.Binding.PeerPort это обратный адрес и порт клиента, а
udp.Binding.IP и udp.Binding.Port это адрес ипорт твоего сервера.

Код

...
procedure TForm1.UDPUDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
str : TstringStream;
pkt : string;
begin
str:=tstringstream.Create('');
  try
    str.CopyFrom(AData, AData.Size);
    pkt:=str.DataString;
  finally
    str.Free;
  end;
IF pos(#$FF+#$FF+#$FF+#$FF+#$54+'Source Engine Query'+#$00,pkt)=1 THEN BEGIN
  udp.Send(udp.Binding.PeerIP,udp.Binding.PeerPort,
    #$FF+#$FF+#$FF+#$FF+#$6D+
    'localhost:port'+#$00+  //address
    'Fake Server Name'+#$00+  // Name
    'Map'+#$00+     // map
    'DirectoryMod'+#$00+  // cstrike
    'Game Name'+#$00+ // Counter-Strike
    #$AB+ // Current Players
    #$BB+ // Max Players
    #$2F+ // Number bots ? hz, const
    #$64+ // 'l' for listen, 'd' for dedicated, 'p' for SourceTV
    #$6C+ // Host operating system. 'l' for Linux, 'w' for Windows
    #$01+ // Password, 0x01 is protected
    #$01+  // If set to 0x01, this server use ModInfo
    'FakeServer.com'+#$00 // other info
    );
//  memo1.Lines.Add('#ClientIP: '+udp.Binding.PeerIP+#13#10+'#Take fake data :)');
END;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
udp.Active:=true;
{if udp.Active=false then begin
  memo1.Lines.Add('Error');
  exit;
end
else begin
  memo1.Lines.Add('Server Startup');
  memo1.Lines.Add('IP:'+udp.Binding.IP);
  memo1.Lines.Add('Port:'+IntToStr(udp.Binding.Port));
end;    }
end;

end.


Автор: fippo 28.11.2008, 13:50
Спасибо, это как раз то что мне нужно  smile Я правда не фейк CS пишу, а свою сетевую игрушку smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)