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 выглядит следующим образом:
Далее представлен пример консольного приложения, демонстрирующего использование 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
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.