Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.11.14;
Скачать: CL | DM;

Вниз

Как лучше посылать сообщения по сети?   Найти похожие ветки 

 
Joni Qwest   (2004-07-07 11:42) [0]

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

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


 
Digitman ©   (2004-07-07 12:06) [1]


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


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

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

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


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


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


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


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


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


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


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


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


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


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


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


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


 
Rouse_ ©   (2004-07-07 12:30) [2]

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


 
Sch   (2004-07-07 12:37) [3]

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

А не работает. То есть для одной рабочей группы (именно 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). В чем дело, непонятно...


 
Sch   (2004-07-07 12:38) [4]

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


 
Дмитрий Ботвин   (2004-08-13 11:01) [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;


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


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

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


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

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


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

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


 
Alex Konshin ©   (2004-09-05 05:06) [9]

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



Страницы: 1 вся ветка

Текущий архив: 2004.11.14;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.047 c
3-1097566777
by
2004-10-12 11:39
2004.11.14
Использование естественных ключей допустимо?


14-1098561157
snif
2004-10-23 23:52
2004.11.14
Удаленный рабочий стол


1-1098936553
Babay
2004-10-28 08:09
2004.11.14
Два вопроса по Д8


14-1098442543
pavel_guzhanov
2004-10-22 14:55
2004.11.14
как вывести комп из сонного состояния?


3-1097827220
d00x
2004-10-15 12:00
2004.11.14
вопрос о ClientDataSet и добавлении записи