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


Автор: ring0D 21.8.2005, 15:11
Люди ! Подскажите пожалуйста вот что : я делаю чат на Дельфи. У всех его пользователей модемы и IP адреса непостоянные. Как сделать чтоб при выходе в Memo отображались IP адреса тех кто в онлайне ? Я понимаю что это должен быть какой-нибудь скрипт ? Подскажите.

Автор: _hunter 22.8.2005, 11:12
пир выходе откуда? и в чем проблема? -- независимо от динамичности IP у клиента будет. в момент подключения к серверу сервер этот IP узнает...

Автор: Плаха 22.8.2005, 11:59
по конкретней плиз. как происходить связь ?

Автор: ring0D 30.8.2005, 13:06
Как запускаешь прогу, прога должна связаться со скриптом что ли ? как я узнаю IP адреса всех у кого моя прога ?

Автор: Плаха 30.8.2005, 15:54
какие компоненты используеш?

Автор: Bibimij 30.8.2005, 18:59
На событие OnShow формы, где располагаются компонеты для работы с протоколом(например, UDP с вклади Indy) пишешь:
Код


procedure TForm1.FormShow(Sender: TObject);
begin
  IdUDPClient1.Host:=255.255.255.255;{т.е. все адреса}
  IdUDPClient1.Send('e'+getip+' '+nick)
end;


, где 'e'(например, но может быть и другой) - условный индекс входа в чат
getip - функция получения Ip-ишника
nick - ник, вводимый в предыдущем окне, например.
Функция getip:

Код

Function TForm1.getip:string;
type
  TaPInAddr = Array[0..10] of PInAddr;
  PaPInAddr = ^TaPInAddr;
var
  phe: PHostEnt;
  pptr: PaPInAddr;
  Buffer: Array[0..63] of Char;
  GInitData: TWSAData;
begin
  WSAStartup($101, GInitData);
  GetHostName(Buffer, SizeOf(Buffer));
  phe := GetHostByName(buffer);
  if phe = nil then Exit;
  pPtr := PaPInAddr(phe^.h_addr_list);
  result:=inet_ntoa(pptr^[0]^);
  WSACleanup  
end;


После этого надо считать сообщение. Делается это так:

Код

procedure TForm1.IdUDPServer1UDPRead(Sender: TObject; AData: TStream;
  ABinding: TIdSocketHandle);
var
  St: TStringStream;
  ipishnik,remotenick: String;
begin
 St := TStringStream.Create('');
 St.CopyFrom(AData, AData.Size);
 if St.DataString[1]='e' then begin
  ipishnik:=strtoint(copy(st.DataString,2,pos(' ',st.DataString)-2));
  remotenick:=copy(St.DataString,pos(' ',st.DataString)+1,length(St.DataString))
 end;
 st.free
end;


В ipishnik - хранится Ip-ишник, а remoteniсk - ник вошедшего пользователя.
И незабудь в общем uses'е прописать winsock!
Ферштейн?

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