Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Реализация передачи по сети сообщений

Delphi , Интернет и Сети , Сеть

Реализация передачи по сети сообщений

Оформил: DeeCo
Автор: http://www.swissdelphicenter.ch

function NetSend(dest, Source, Msg: string): Longint; overload;
 type
   TNetMessageBufferSendFunction = function(servername, msgname, fromname: PWideChar;
     buf: PWideChar; buflen: Cardinal): Longint;
    stdcall;
 var
   NetMessageBufferSend: TNetMessageBufferSendFunction;
   SourceWideChar: PWideChar;
   DestWideChar: PWideChar;
   MessagetextWideChar: PWideChar;
   Handle: THandle;
 begin
   Handle := LoadLibrary('NETAPI32.DLL');
   if Handle = 0 then
   begin
     Result := GetLastError;
     Exit;
   end;
     @NetMessageBufferSend := GetProcAddress(Handle, 'NetMessageBufferSend');
   if @NetMessageBufferSend = nil then
   begin
     Result := GetLastError;
     Exit;
   end;

   MessagetextWideChar := nil;
   SourceWideChar      := nil;
   DestWideChar        := nil;

   try
     GetMem(MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
     GetMem(DestWideChar, 20 * SizeOf(WideChar) + 1);
     StringToWideChar(Msg, MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
     StringToWideChar(Dest, DestWideChar, 20 * SizeOf(WideChar) + 1);

     if Source = '' then
       Result := NetMessageBufferSend(nil, DestWideChar, nil,
         MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1)
     else
     begin
       GetMem(SourceWideChar, 20 * SizeOf(WideChar) + 1);
       StringToWideChar(Source, SourceWideChar, 20 * SizeOf(WideChar) + 1);
       Result := NetMessageBufferSend(nil, DestWideChar, SourceWideChar,
         MessagetextWideChar, Length(Msg) * SizeOf(WideChar) + 1);
       FreeMem(SourceWideChar);
     end;
   finally
     FreeMem(MessagetextWideChar);
     FreeLibrary(Handle);
   end;
 end;

 function NetSend(Dest, Msg: string): Longint; overload;
 begin
   Result := NetSend(Dest, '', Msg);
 end;

 function NetSend(Msg: string): Longint; overload;
 begin
   Result := NetSend('', '', Msg);
 end;

 // Example: 

procedure TForm1.Button1Click(Sender: TObject);
 const
   NERR_BASE = 2100;
   NERR_NameNotFound = NERR_BASE + 173;
   NERR_NetworkError = NERR_BASE + 36;
   NERR_Success = 0;
 var
   Res: Longint;
   sMsg: string;
 begin
   Res := NetSend('LoginName', 'Your Message...');
   case Res of
     ERROR_ACCESS_DENIED: sMsg := 'user does not have access to the requested information.';
     ERROR_INVALID_PARAMETER: sMsg := 'The specified parameter is invalid.';
     ERROR_NOT_SUPPORTED: sMsg := 'This network request is not supported.';
     NERR_NameNotFound: sMsg := 'The user name could not be found.';
     NERR_NetworkError: sMsg := 'A general failure occurred in the network hardware.';
     NERR_Success: sMsg := 'Message sent!';
   end;
   ShowMessage(sMsg);
 end;

Перевод контента на русский язык:

Код, предоставленный ниже, это реализация функции NetSend в Delphi, которая отправляет сообщения по сети с помощью Windows API NetBIOS. Функция принимает три параметра: Dest, Source и Msg, представляющие имя или IP-адрес назначенного компьютера, имя или IP-адрес источника (опционально) и сообщение для отправки соответственно.

Вот разбивка кода:

  1. Первая часть кода определяет тип TNetMessageBufferSendFunction для функции NetBIOS API NetMessageBufferSend. Эта функция используется для отправки сообщений по сети.
  2. Следующий раздел объявляет переменные и инициализирует их: NetMessageBufferSend, SourceWideChar, DestWideChar, MessagetextWideChar и Handle.
  3. Код затем загружает библиотеку NetBIOS API (NETAPI32.DLL) с помощью функции LoadLibrary. Если загрузка fails, она возвращает сообщение об ошибке.
  4. Он получает указатель на функцию NetMessageBufferSend с помощью функции GetProcAddress. Если это fails, также возвращает сообщение об ошибке.
  5. Код затем выделяет память для трех строк широких символов: MessagetextWideChar, DestWideChar и SourceWideChar. Эти строки будут содержать текст сообщения, имя или IP-адрес назначенного компьютера, и имя или IP-адрес источника (если указано), соответственно.
  6. Он конвертирует входной строку в широкий символ с помощью функции StringToWideChar. Это необходимо потому, что функции NetBIOS API ожидает широкие символы как входные данные.
  7. Если параметр Source пуст, код настраивает параметры назначения и сообщения для функции NetMessageBufferSend соответственно. Если Source не пуст, также настраивает имя или IP-адрес источника.
  8. Код затем вызывает функцию NetMessageBufferSend для отправки сообщения по сети. Она возвращает результат, указывающий, была ли операция успешной или нет.
  9. Наконец, код освобождает память, выделившуюся для строк широких символов с помощью функции FreeMem и уничтожает библиотеку NetBIOS API с помощью функции FreeLibrary.

Три перегруженные версии функции NetSend позволяют использовать различные способы указания имени или IP-адреса назначенного компьютера и имени или IP-адреса источника. Пример кода в конце демонстрирует, как использовать эти функции в приложении Delphi.

Некоторые улучшения можно было бы сделать в этом коде:

  • Обработка ошибок: Хотя код пытается обрабатывать ошибки, возвращая сообщения об ошибках, лучше было бы предоставить более конкретные и описательные сообщения об ошибках.
  • Организация кода: Код очень плотный и может быть разделен на отдельные процедуры или функции для каждого задачи (например, загрузка библиотеки NetBIOS API, конвертация строк в широкие символы и т.д.).
  • Безопасность типов: Хотя Delphi имеет безопасные типы, все еще можно случайно передать неправильный тип аргумента функции. Рассмотрите добавление явного кастинга или проверки аргументов перед вызовом функций.
  • Комментарии кода: Добавление более подробных комментариев к объяснению каждого части кода было бы полезно для поддержки и понимания.

Альтернативным решением может быть использование современных сетевых API, таких как Winsock или Indy, которые обеспечивают лучшую обработку ошибок, улучшенную производительность и большую гибкость.

В статье описана реализация функции NetSend для передачи сообщений по сети, написанная на языке Delphi.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Сеть ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 14:54:30/0.0034871101379395/0