На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
Дорогие друзья! Поздравляем вас с днём Победы!
msm.ru
! Соблюдайте общие правила форума
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.
Указывайте точные версии Delphi и используемых сетевых библиотек.

Не приветствуется поднятие старых тем. Если ваш вопрос перекликается со старой темой, то для вопроса лучше создать новую тему, а старую указать в первом сообщении с описанием взаимосвязи.

Внимание:
попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Krid, user posted image Rouse_

Модераторы: Krid, Rouse_
  
> LanChat , Чат
    Как сделать чат?

    - Какие компоненты лючше использовать
    - ...

    Может исходник найджется 7

    PLZ
      Найдётся smile.gif
      Delphi\Demos\Internet\Chat
        Этот пример мне не очень нравится херота какаято! Лючше если бы всё это объеденить ещё!!
          ну так вперед, если лень поищи в нете.
            Что может быть проще?
            я юзаю только TClient(Server)Socket, все отлично.
              Проще некуда. (но я юзаю апишные ф-ции напрямую)
              Есть еще множетсво примеров в MSDN от шестой студии.
                Проще, проще, дайте хоть пример ...

                В компонентах нашёл
                > Indy >
                >> idTCPSrver (на этих компонентах построен исходник в demos)
                >> idTCPClient

                >> idUdpServer
                >> idUdpClient

                Можно краткую инфу по этим компонентам ..
                Какой лючше использовать (TCP or Udp)
                  Я же сказал. Читай MSDN. Есть сетевая версия...
                      Сделал я чат на основе TCP !
                      Лично мне не очень понравился!"

                      Возможно ли сделать чат без SErver and Client?
                      Как узнать IP Всех компов подключенных к локалке?

                      plz...
                        Цитата
                        n0wheremany, 22.12.03, 18:12
                        Как узнать IP Всех компов подключенных к локалке?



                        var
                          Computer: array [1..500] of string[25];
                          ComputerCount: Integer;

                        procedure FindAllComputers(Workgroup: string);
                        var
                          EnumHandle: THandle;
                          WorkgroupRS: TNetResource;
                          Buf: array [1..500] of TNetResource;
                          BufSize: Integer;
                          Entries: Integer;
                          Result: Integer;
                        begin
                          ComputerCount := 0;
                          Workgroup := Workgroup + #0;
                          FillChar(WorkgroupRS, SizeOf(WorkgroupRS) , 0);
                          with WorkgroupRS do
                          begin
                            dwScope := 2;
                            dwType := 3;
                            dwDisplayType := 1;
                            dwUsage := 2;
                            lpRemoteName := @Workgroup[1];
                          end;

                          WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @WorkgroupRS, EnumHandle);

                          repeat
                            Entries := 1;
                            BufSize := SizeOf(Buf);

                            Result := WNetEnumResource(EnumHandle, Entries, @Buf, BufSize);
                            if (Result = NO_ERROR) and (Entries = 1) then
                            begin
                              Inc( ComputerCount );
                              Computer[ ComputerCount ] := StrPas(Buf[1].lpRemoteName);
                            end;
                          until
                            (Entries <> 1) or (Result <> NO_ERROR);

                          WNetCloseEnum( EnumHandle );
                        end;

                        способ 2
                        unit FindComp;  

                        interface  

                        uses  
                         Windows, Classes;  

                        function FindComputers: DWORD;  

                        var  
                         Computers: TStringList;  

                        implementation  

                        uses  
                         SysUtils;  

                        const  
                         MaxEntries = 250;  

                        function FindComputers: DWORD;  

                        var  
                         EnumWorkGroupHandle, EnumComputerHandle: THandle;  
                         EnumError: DWORD;  
                         Network: TNetResource;  
                         WorkGroupEntries, ComputerEntries: DWORD;  
                         EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;  
                         EnumBufferLength: DWORD;  
                         I, J: DWORD;  

                        begin  

                         Computers.Clear;  

                         FillChar(Network, SizeOf(Network), 0);  
                         with Network do  
                         begin  
                           dwScope := RESOURCE_GLOBALNET;  
                           dwType := RESOURCETYPE_ANY;  
                           dwUsage := RESOURCEUSAGE_CONTAINER;  
                         end;  
                           
                         EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle);  

                         if EnumError = NO_ERROR then  
                         begin  
                           WorkGroupEntries := MaxEntries;  
                           EnumBufferLength := SizeOf(EnumWorkGroupBuffer);  
                           EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength);  

                           if EnumError = NO_ERROR then  
                           begin  
                             for I := 1 to WorkGroupEntries do  
                             begin  
                               EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer[I], EnumComputerHandle);  
                               if EnumError = NO_ERROR then  
                               begin  
                                 ComputerEntries := MaxEntries;  
                                 EnumBufferLength := SizeOf(EnumComputerBuffer);  
                                 EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength);  
                                 if EnumError = NO_ERROR then  
                                   for J := 1 to ComputerEntries do  
                                     Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));  
                                 WNetCloseEnum(EnumComputerHandle);  
                               end;  
                             end;  
                           end;  
                           WNetCloseEnum(EnumWorkGroupHandle);  
                         end;  

                         if EnumError = ERROR_NO_MORE_ITEMS then  
                           EnumError := NO_ERROR;  
                         Result := EnumError;  

                        end;  

                        initialization  

                         Computers := TStringList.Create;  

                        finalization  

                         Computers.Free;  

                        end.




                        Song хотел послать в фак, но там вроде нету smile.gif
                          2 POD в инет-факе может и нету, а вот в том хоторый DelphistFAQ.chm есть
                            А насчёт первого вороса мыслей нет?
                              Цитата
                              n0wheremany, 24.12.03, 21:19
                              А насчёт первого вороса мыслей нет?

                              имхо лучше делать на основе MAILSLOT - это будет аналог WinPopup'а или команды net send
                              плюсы тут как раз то что не нужна связка клиент - сервер
                              инфу можна нарыть тут
                              http://firststeps.narod.ru/vc/winapi/154.html
                              http://delphiworld.narod.ru/base/net_data_...l_channels.html
                                Скачал я GlobusLib! И всё равно неразобрался чо почём!
                                Может кто пожуёт мне шуть-шуть? blink.gif
                                  в GlobusLib в общем ничего сложного, но я ждал большего... У меня такой вопрос(ы) : Это через эту службу работает Winpopup ? А то я как-то никогда не видел чтоб один был сервером а второй клиентом, или у всех оба запущены? Если так, то какой смысл использовать GlobusLib, если можно обойтись API, Client(Server)Socket'ами. А вообще я прогу видел у друга в общаге, даже не одну, которая рассылает сообщения как Winpopup и получает вроде как единый стандарт обмена сообщениями.
                                    >Diamond - прочитай все-таки ZEE Сообщ. #14 от 25.12.03, 10:43 - может станет яснее...
                                      Цитата

                                      Diamond от 28.12.03, 08:58
                                      В GlobusLib в общем ничего сложного, но я ждал большего... У меня такой вопрос(ы) : Это через эту службу работает Winpopup ? А то я как-то никогда не видел чтоб один был сервером а второй клиентом, или у всех оба запущены? Если так, то какой смысл использовать GlobusLib, если можно обойтись API, Client(Server)Socket'ами. А вообще я прогу видел у друга в общаге, даже не одну, которая рассылает сообщения как Winpopup и получает вроде как единый стандарт обмена сообщениями.


                                      Я разобрался полность в GlobusLib! Охрененная вещь! Очень простая!

                                      Работа компонента MailslotTerminal >
                                      > Создаётся лиия передачи данных

                                      Он (компонент) читает из этой линии массаги, и отправляетт"

                                      /// Изменены названия, чтобы было понятно

                                      Здесь нет ни клиента ни сервера. Программа работает как клиент, а сервером выступает та самая линия!

                                      // Эсли что нетак - обоснуйте // ^)

                                      Такой вопросик
                                      > Как узнать свой IP адресс в локальной сети
                                      // Мне нужна проседура типа
                                      ExpandedWrap disabled
                                        procedure GetIpAdress:string
                                      и никокая другая типа введи имя домена и получишь Ипок!



                                      // Скоро появится релизная версия чата

                                      Добавлено в :
                                      Да и ещё как отправить файл (или папку) по локалке с програссом копирования!
                                        вот че-то похожее есть
                                        http://eef.ispu.ru/sitestud/sav/uddf/pages...rk.htm#network4
                                        тока не стринг получается, а лонгинт...
                                          Цитата
                                          ZEE от 29.12.03, 13:17
                                          вот че-то похожее есть
                                          http://eef.ispu.ru/sitestud/sav/uddf/pages...rk.htm#network4
                                          тока не стринг получается, а лонгинт...


                                          Использовал пример! Сети нет а выдал другой адресс (не 127.0.0.1) да и ещё без точек, а раставлять самим невозможно тк строку вида 164001002003 не выдеёт! Это неудобно! Есть ли ещё какой-ни-дь пример

                                          Да и ещё

                                          Цитата
                                          Да и ещё как отправить файл (или папку) по локалке с програссом копирования!



                                          Всех с новым годом ;) :mellow: ;) ;) ;)
                                            Вот что меня интересует: Mailslot - альтернатива winpopup или он ее и использует?
                                              на счет определения своего IP
                                              ниже приведу две ф-ции - если их вызвать так
                                              result:=GetIPByHostName(GetHostNameByIP(''))
                                              то в результат выдаст как раз свой IP

                                              ExpandedWrap disabled
                                                function GetHostNameByIP(IP:PChar):string;
                                                var wVersionRequested : WORD;
                                                    wsaData : TWSAData;
                                                    Addr: LongWord;
                                                    p: PHostEnt;
                                                begin
                                                  result:='?';
                                                  wVersionRequested := MAKEWORD(1, 1);
                                                  WSAStartup(wVersionRequested, wsaData);
                                                  Addr:=inet_addr(IP);
                                                  p:=GetHostByAddr(@Addr,128,AF_INET);
                                                  WSACleanup;
                                                  if p<>nil then result:=p^.h_Name;
                                                end;
                                                 
                                                function GetIPByHostName(const dn:string):string;
                                                type TaPInAddr = array[0..250] of PInAddr;
                                                     PaPInAddr = ^TaPInAddr;
                                                var r: PHostEnt;
                                                    wsaData: TWSAData;
                                                    pptr: PaPInAddr;
                                                    i: integer;
                                                    s: string;
                                                begin
                                                  WSAStartup($0101, wsaData);
                                                  r:=gethostbyname(PChar(dn));
                                                  if r=nil then
                                                  begin
                                                    result:='?';
                                                    exit;
                                                  end;
                                                  pptr:=PaPInAddr(r^.h_addr_list);
                                                  i:=0;
                                                  while pptr^[i]<>nil do
                                                  begin
                                                    s:=inet_ntoa(pptr^[0]^);
                                                    inc(i);
                                                  end;
                                                  WSACleanup;
                                                  result:=s;
                                                end;


                                              зы: ф-ции писались когда-то давно - если покажутся слегка корявые - то извините...

                                              Добавлено в :
                                              млин, чуть не забыл uses WinSock;
                                                А у меня другой вопрос:
                                                пишу что-то вроде чата, но не хочется забивать трафик.....при посылке сообщения с сервера он посылается на все соединения...а хотелось бы чтобы посылалось именно выбранному адресату.....как это лучше сделать....привязка к IP или может имя компьютера...и как это реализовать
                                                  Цитата
                                                  Invader, 19.01.04, 16:31
                                                  пишу что-то вроде чата, но не хочется забивать трафик.....при посылке сообщения с сервера он посылается на все соединения...а хотелось бы чтобы посылалось именно выбранному адресату.....как это лучше сделать

                                                  что ж это за чат такой который всем отправляет? надож отсылать на конктерное соединение (ServerSocket1.Socket.Connections[<номер соединения>]) это если через сокеты - хотя я наверно делал бы через слоты...
                                                    люди а как релизовать массовую расылку через Клиент Сокет если на других машинах уже открыт Сервер Сокет?
                                                      Цитата
                                                      люди а как релизовать массовую расылку через Клиент Сокет если на других машинах уже открыт Сервер Сокет?


                                                      Я делал так: Один сервер - все остальные клиенты. Все клиенты шлют серверу, сервер рассылает всем.
                                                      Потом я от этой схемы отказался ибо глюкаво и медленно. Сейчас юзаю mailslot. Вроде удобно.
                                                      Хотя сам не знаю как с его помощь послать сообщение WinPopup'у да и в инете по IP он тоже вроде не пашет.
                                                        Цитата
                                                        Diamond, 20.01.04, 02:15
                                                        Хотя сам не знаю как с его помощь послать сообщение WinPopup'у

                                                        через \MAILSLOT\MESSNGR (уже кажись писАл)
                                                        Цитата
                                                        Diamond, 20.01.04, 02:15
                                                        и в инете по IP он тоже вроде не пашет

                                                        да не пашет - это локально-сетевая фишка...
                                                          ZEE,
                                                          Цитата
                                                          ServerSocket1.Socket.Connections[<номер соединения>]

                                                          я так и делаю......ой а че это я тогда тему поднял :huh:
                                                          то есть сервер получает сообщение от клиента, запоминает его номер, а потом выдает ответ на этот же номер.....так чтоли?!
                                                          ну я что-то торможу в последнее время...все...все...надо ночью спать :D
                                                            Цитата
                                                            сервер получает сообщение от клиента, запоминает его номер, а потом выдает ответ на этот же номер


                                                            Ну и что? Или клиент своих сообений не должен видеть? Заодно и проверяешь дошло сообщение до сервера или нет. Траффик конечно забиваеться, но если это не критично, то можно сделать и так.
                                                              Diamond,
                                                              меня другое волнует...не знаю как сделать так чтобы сервер знал номер клиента...допустим почти одновременно присоединились несколько клиентов...каждому надо разослать сообщение но незнаю как узнать номера соединения для определенного клиента
                                                                Ну во-первых клиенты могут посылать в начале сообщения заголовок где они указывают кто они, но это масло масленное т.к. в заголовке IP пакета и так содержиться нужна инфа. Если клиент присоеденился то в событие сервера указывается параметр Socket так вот если ты напишешь Socket.SendText();то отправишь сообщение тому кто только что присоединился. Может отлавливать события OnClientConncet и OnAccept. Вообще у меня такой проблемы не возникало т.к. если посмотреть инфу Server.Socket.RemoteHost, то увидишь информацию о том клиенте который последним совершил обращение к серверу.
                                                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                                0 пользователей:


                                                                Рейтинг@Mail.ru
                                                                [ Script execution time: 0,0561 ]   [ 16 queries used ]   [ Generated: 10.05.24, 20:04 GMT ]