![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проверить, используется ли уже данный UDP порт. [D7, WinXP]
DVM © (2007-05-24 14:48:00)Для TCP делал так:
function TestTCPPort(Port: integer): boolean;
var
WSA : TWSAData;
ListenSocket: TSocket;
SockAddr : TSockAddr;
begin
result := false;
if WSAStartup($101, WSA) <> 0 then exit;
try
ListenSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if ListenSocket = INVALID_SOCKET then exit;
try
FillChar(SockAddr, SizeOf(TSockAddr), 0);
SockAddr.sin_family := AF_INET;
SockAddr.sin_port := htons(Port);
SockAddr.sin_addr.S_addr := INADDR_ANY;
if bind(ListenSocket, SockAddr, SizeOf(TSockAddr)) <> 0 then exit;
if listen(ListenSocket, SOMAXCONN) <> 0 then exit;
result := true;
finally
Closesocket(ListenSocket);
end;
finally
WSACleanup;
end;
end;
Для UDP так не проходит, если я просто заменяю
SOCK_STREAM на SOCK_DGRAM.
Что неправильно?
DVM (2007-05-24 15:19:00) [1]
> Если порт занят, bind() вернет отказ.
Ясно. Буду справку внимательнее читать. :)
Сергей М. (2007-05-24 15:15:00) [2]Более того, для определения "занятости" порта вызов listen() вообще не нужен - ни при SOCK_STREAM, ни при SOCK_DGRAM.
Если порт занят, bind() вернет отказ.
DVM (2007-05-24 15:05:00) [3]
> Сергей М. © (24.05.07 14:59) [1]
Спасибо.
Сергей М. (2007-05-24 14:59:00) [4]
> Что неправильно?
Ответ - прямо в справке:
listenapplies only to sockets that are connection oriented, for example, those of type SOCK_STREAM