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

Работа с WinInet в Delphi 2010: определение номера порта клиента после установления соединения

Delphi , Интернет и Сети , Сокеты

WinInet – это компонент Windows, предоставляющий набор функций для работы в интернете. Одной из задач, с которой может столкнуться разработчик, работающий с WinInet в среде Delphi 2010, является необходимость определения номера порта клиента после установления соединения с сервером. В этом материале мы рассмотрим, как решить данную задачу, используя примеры кода на Object Pascal.

Проблема

При установлении соединения с сервером через сокет, как клиент, так и сервер открывают свои сокеты. Номер порта сервера известен, так как он используется для подключения. Однако, номер порта клиента может быть неизвестен, и задача состоит в том, чтобы его определить.

Решение

Для получения информации о сокете, включая номер порта клиента, можно использовать функцию InternetQueryOption с флагом INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO. Эта функция возвращает структуру INTERNET_DIAGNOSTIC_SOCKET_INFO, которая содержит необходимую информацию, включая номера портов клиента и сервера.

Пример кода

Вот пример функции GetSocketInfo, которая возвращает информацию о сокете:

function GetSocketInfo(hInet: HINTERNET): TINTERNET_DIAGNOSTIC_SOCKET_INFO;
var
  lpdwBufferLength: DWORD;
begin
  lpdwBufferLength := SizeOf(TINTERNET_DIAGNOSTIC_SOCKET_INFO);
  ZeroMemory(@Result, lpdwBufferLength);
  if not InternetQueryOption(hInet, INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO, @Result, lpdwBufferLength) then
    RaiseLastOSError;
end;

Структура TINTERNET_DIAGNOSTIC_SOCKET_INFO в Delphi выглядит следующим образом:

PINTERNET_DIAGNOSTIC_SOCKET_INFO = ^TINTERNET_DIAGNOSTIC_SOCKET_INFO;
TINTERNET_DIAGNOSTIC_SOCKET_INFO = record
  Socket: DWORD_PTR;
  SourcePort: DWORD;
  DestPort: DWORD;
  Flags: DWORD;
end;

Пример использования

Далее представлен пример консольного приложения, демонстрирующего использование INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO для получения информации о сокете:

{$APPTYPE CONSOLE}
uses
  Windows,
  WinInet,
  SysUtils;

type
  PINTERNET_DIAGNOSTIC_SOCKET_INFO = ^TINTERNET_DIAGNOSTIC_SOCKET_INFO;
  TINTERNET_DIAGNOSTIC_SOCKET_INFO = record
    Socket: DWORD_PTR;
    SourcePort: DWORD;
    DestPort: DWORD;
    Flags: DWORD;
  end;

const
  INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO = Cardinal(67);

function GetSocketInfo(hInet: HINTERNET): TINTERNET_DIAGNOSTIC_SOCKET_INFO;
var
  lpdwBufferLength: DWORD;
begin
  lpdwBufferLength := SizeOf(TINTERNET_DIAGNOSTIC_SOCKET_INFO);
  ZeroMemory(@Result, lpdwBufferLength);
  if not InternetQueryOption(hInet, INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO, @Result, lpdwBufferLength) then
    RaiseLastOSError;
end;

procedure WinInet_HttpGet(const Url: string);
var
  hInter: HINTERNET;
  UrlHandle: HINTERNET;
  BytesRead: DWORD;
  Buffer: Pointer;
  SocketInfo: TINTERNET_DIAGNOSTIC_SOCKET_INFO;
begin
  // Код для установления соединения и загрузки файла, в котором демонстрируется получение информации о сокете
end;

begin
  try
    WinInet_HttpGet('http://example.com');
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.

Вывод информации о сокете

После получения структуры TINTERNET_DIAGNOSTIC_SOCKET_INFO, можно вывести информацию о портах:

SocketInfo := GetSocketInfo(UrlHandle);
Writeln('Socket Info');
Writeln(Format('Source Port %d', [SocketInfo.SourcePort]));
Writeln(Format('Dest   Port %d', [SocketInfo.DestPort]));

Заключение

В данной статье мы рассмотрели, как с помощью WinInet и Delphi 2010 определить номер порта клиента после установления соединения с сервером. Использование функции InternetQueryOption с флагом INTERNET_OPTION_DIAGNOSTIC_SOCKET_INFO позволяет получить необходимую информацию о сокете, включая номера портов клиента и сервера. Надеемся, что этот материал окажется полезным для разработчиков, работающих с WinInet в Delphi.

Создано по материалам из источника по ссылке.

В материале рассматривается работа с WinInet в Delphi 2010 для определения номера порта клиента после установления соединения с сервером.


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

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




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


:: Главная :: Сокеты ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 07:41:23/0.0033309459686279/0