Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как лучше посылать сообщения по сети? [D7, Win95/98, WinME, Win2k, WinXP]


Joni Qwest ©   (2004-07-07 11:42:00) 

Пишу мессенджер для локалки. Пробовал много способов передачи сообщений, но все оказались немного не удовлетворяющими моим запросам. Например:
1. Использовал компоненты TServerSocket и TClientSocket - очень уж трудоёмко (надо коннектится и уж тогда отправлять данные), да и когда разрываешь одно из активных соединений, то вылетает ошибка сокета. Ещё не додумался как передавать форматированный текст.
2. Использовал компоненты TidUDPServer и TidUDPClient - очень клёво, быстро, просто, но не узнаешь получил ли адресат твоё сообщение.
3. Использовал поточные компоненты, но там не додумался как отредактировать входящий текст, ведь в нём по мимо сообщения содержится другая информация (о пользователе и т.д.)

Может кто нибудь уже встречался с данным вопросом? Помогите пожалуйста, программеры, может советом, может исходничком. Очень бы хотелось быстро и просто передавать форматированный текст и картинки. Для ввода текста и графической информации использую RxRichEdit. Могу заплатить за хороший, полный пример. Что не понятно спрашивайте.


Alex Konshin   (2004-09-05 05:06:00) [1]

А если в команде указать еще и имя домена?


deff   (2004-09-05 00:47:00) [2]

да там может, маршрутизатор на пути рубит левые пакеты


taliano   (2004-08-17 14:03:00) [3]

>>Sch
A сервис Messenger на Svetlana запущен?


Рамиль   (2004-08-13 11:08:00) [4]


> "А не работает. "- в смысле, net send у меня не работает
> под Win2003Server на всех...

С DNS проблемы, скорее всего.


Дмитрий Ботвин   (2004-08-13 11:01:00) [5]

Лови код, у меня нормально пашет:

Uses Winsvc;

procedure TForm6.SendButtonClick(Sender: TObject);
 var i: integer;
     SList: TStringList;
     Msg: String;
     HostName,MessageName: WideString;
     buflen: DWORD;
     error: NET_API_STATUS;
 begin
   if Length(SendUser.Text)=0 then
      begin
         Application.MessageBox('Не указан пользователь, от имени которого отправляем!','Ошибка',MB_OK+MB_ICONSTOP);
         exit;
      end;
   if Length(Form1.CompName.Text)<>0 then
     begin
       HostName:=WideString(Trim(Form1.CompName.Text));
       MessageName:=WideString(Trim(SendText.Text));
       buflen:=200;
       error:=NetMessageBufferSend(nil,PWideChar(HostName),PWideChar(WideString(Trim(SendUser.Text))),PWideChar(MessageName),bu flen);
       if error=NERR_Success then Application.MessageBox('Сообщение успешно отправлено!','Отправка сообщений',MB_OK+MB_ICONINFORMATION)
       else Application.MessageBox('Сообщение не отправлено!'+#13#10+'Проверьте состояние службы сообщений','Отправка сообщений',MB_OK+MB_ICONSTOP);
       Form6.Close;
     end
   else
     begin
       SList:=TStringList.Create;
       for i:=0 to Form1.Computers.Items.Count-1 do
          begin
            HostName:=WideString(Trim(Form1.Computers.Items[i].Caption));
            MessageName:=WideString(Trim(SendText.Text));
            buflen:=200;
            error:=NetMessageBufferSend(nil,PWideChar(HostName),PWideChar(WideString(Trim(SendUser.Text))),PWideChar(MessageName),bu flen);
            if error<>NERR_Success then SList.Add(Form1.Computers.Items[i].Caption);
            Label3.Caption:='Отправлено собщение на '+IntToStr(i+1)+' из '+IntToStr(Form1.Computers.Items.Count);
            Application.ProcessMessages;
          end;
       if SList.Count=0 then Application.MessageBox('Сообщение успешно отправлено на все компьютеры!','Отправка сообщений',MB_OK+MB_ICONINFORMATION)
       else
          begin
             for i:=0 to SList.Count-1 do
                if i<SList.Count-1 then Msg:=Msg+SList.Strings[i]+', '
                else Msg:=Msg+SList.Strings[i];
             Application.MessageBox(PChar('Не смог отправить сообщение на следующие компьютеры: '+Msg),'Отправка сообщений',MB_OK+MB_ICONEXCLAMATION)
          end;
       Form6.Close;
     end;
 end;


Sch   (2004-07-07 12:38:00) [6]

"А не работает. "- в смысле, net send у меня не работает под Win2003Server на всех...


Sch   (2004-07-07 12:37:00) [7]

Не в тему, но все же...

А не работает. То есть для одной рабочей группы (именно workgroup, не domen) работает, для другой - не для всех пользователей, вообще почти не для кого. хотя под NT4 все было тип топ и используется без каких либо изменений, только поменян NT4 на 2003Server.
Дает

C:\>net send ludmila BUM-BUM
The message was successfully sent to LUDMILA.

C:\>net send Svetlana BUM-BUM
An error occurred while sending a message to SVETLANA.

The message alias could not be found on the network.

More help is available by typing NET HELPMSG 2273.

C:\>net send Sch test
The message was successfully sent to SCH.

LUDMILA, Sch,Svetlana - все в Vakars, сервер - в Workgroup (там всем доходит, кроме WinMe)...
Все компы врублены, на всех traypopup(вместо winpopup). В чем дело, непонятно...


Rouse_   (2004-07-07 12:30:00) [8]

Поищи тут же примеры использования NetMessageBufferSend
если не найдешь:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/netmgmt/netmgmt/netmessagebuffersend.asp


Digitman   (2004-07-07 12:06:00) [9]


> хотелось быстро и просто передавать


хочешь "быстро" и имеешь при этом ЛВС под управлением ОС от Майкрософт - используй именованые программные каналы (Named Pipes), они гарантируют доставку и используют протокол NetBIOS, который гораздо эффективней в такой сети нежели протокол TCP

хочешь "просто" и имеешь при этом ЛВС под управлением ОС от Майкрософт - используй мэйлслоты (Mail Slots), они НЕ гарантируют доставку, НЕ сложней в использовании, но эффективней UDP

о программных каналах и мэйлслотах читай в MSDN и станд.справке Делфи по Win32API


> Использовал компоненты TServerSocket и TClientSocket - очень
> уж трудоёмко (надо коннектится и уж тогда отправлять данные),


что ж тут трудоемкого ? разумеется, коннект нужен, ибо компоненты эти используют connection oriented протокол TCP


> когда разрываешь одно из активных соединений, то вылетает
> ошибка сокета


ну и что ? просто нужно четко представлять себе, как грамотно обрабатывать ошибки


> Ещё не додумался как передавать форматированный текст


если речь идет о RichEdit, то форматированный текст - это обычный текст, включающий в себя управляющие символы тэгов форматирования


> Использовал компоненты TidUDPServer и TidUDPClient - очень
> клёво, быстро, просто, но не узнаешь получил ли адресат
> твоё сообщение


почему бы адресату в ответ не послать подтверждение приема ?


> Использовал поточные компоненты


а это еще что такое ?


> Для ввода текста и графической информации использую RxRichEdit


да ради бога.. но к сетевому транспорту это не имеет отношения


Наверх

Титульная страница Поиск, карта сайта Написать письмо