- Смайлик видишь?
- Нет.
- И я не вижу. А он есть.
var SockAddrIn : TSockAddrIn;
FSocket : TSocket;
...
If bind(FSocket, SockAddrIn, SizeOf(SockAddrIn)) <> 0 Thenbegin
обрабатываем WSAGetLastError
end;
Here's the translation of the text into Russian:
Неплохой код на Delphi!
Задача - определить, занят ли сокетный порт. Код пытается привязать сокет к конкретному адресу и порту с помощью функции bind(). Если привязка не succeeds, то это означает, что порт уже занимается другим процессом или приложением.
Код делает следующее:
Он определяет две переменные: SockAddrIn типа TSockAddrIn, представляющий структуру сокета, и FSocket типа TSocket, который является объектом сокета.
Функция bind() вызывается с тремя аргументами:
FSocket: объект сокета для привязки.
SockAddrIn: структура сокета, содержащая желаемый адрес и порт.
SizeOf(SockAddrIn): размер структуры SockAddrIn в байтах.
Если привязка не succeeds (т.е. возвращаемое значение не равно 0), код enters the begin блок, где он пытается получить последний ошибку с помощью WSAGetLastError() и, вероятно, обрабатывает ошибку соответствующим образом.
Если вы хотите проверить, занят ли порт без привязки сокета к нему, можно попробовать использовать функцию GetTcpTable() (на Windows) или эквивалентные функции на других платформах. Эти функции позволяют перечислить все открытые сокеты TCP на вашем компьютере, включая их порты и идентификаторы процессов.
Вот пример, как можно модифицировать код для использования GetTcpTable():
var
TcpTable: TTcpTable;
PortInUse: Boolean;
procedure CheckPortInUse(PortNumber: Integer);
begin
ZeroMemory(@TcpTable, SizeOf(TcpTable));
TcpTable.dwSize := SizeOf(TcpTable);
GetTcpTable(@TcpTable, @TcpTable.dwSize);
for i := 0 to TcpTable.dwNumEntries - 1 do
begin
if TcpTable.lpTcpEntry[i].dwState = MFT_STATE_ESTABLISHED then
if TcpTable.lpTcpEntry[i].dwLocalPort = PortNumber then
PortInUse := True;
end;
if PortInUse then
writeln('Порт ', PortNumber, ' занят.');
else
writeln('Порт ', PortNumber, ' доступен.');
end;
Код использует функцию GetTcpTable() для получения списка всех открытых сокетов TCP на вашем компьютере. Затем он iterates over список, проверяя каждый сокет'с состояние и локальный порт номер. Если он находит сокет с желаемым портом номером в состоянии "established" (соединенном), он sets флаг PortInUse в True. Наконец, он печатает сообщение, указывающее, занят ли порт или доступен.
Обратите внимание, что это подход может не быть столь точным, как привязка сокета к порту и проверка ошибок, но он может предоставить быстрый и простой способ проверки, занят ли порт.
Статья описывает проверку занятости порта сокета на языке Delphi с помощью функции bind.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.