如何判断某一端口已被占用?(50分)

  • 主题发起人 主题发起人 无厘头
  • 开始时间 开始时间

无厘头

Unregistered / Unconfirmed
GUEST, unregistred user!
如何判断某一端口已被占用?
我想像QQ那樣的UDP端口自動分配问题?按順序
 
打开端口,看看是否成功,失败的话即被占用.
 
你可以用一个网络控件,然后试图打开这个端口,如果被占用,出错信息会提示,捕获这个出错信息就可以了!
 
procedure TForm1.Timer1Timer(Sender: TObject);
var
I : integer;
begin
Memo1.Clear;
for I := 0 to 1000 do begin
ServerSocket1.Close;
ServerSocket1.Port := I;
try
ServerSocket1.Open;
except
Memo1.Lines.Add(IntToStr(I) + '端口被打开!');
end;
end;
Timer1.Enabled := FALSE;
end;
 
怎麼我試的時候常出錯的:(
 
用try..finally..end试图打开就可以,大不开的就被用了
 
如果不用程序实现可以参考如下
telnet ip 端口
占用会在左上角光标闪烁,否则报错退出
 
我是要用程序實現的,把那未被占用的端口分配給多開的客戶端,像QQ的端口分配一樣
 
可以用WINSOCK助手涵数,就能够得到所有目前系统已经打开的端口,但前提是在WIN2000以上的操作系统
 
xmcccc:
WINSOCK涵数怎麼用呢
 
明天发给你代码,今天要下班了
 
uses winsock2;
//获取一个空闲的端口
function GetFreePort(ABeginPort: Integer; const ATCP: Boolean = false): Integer;
var
Wsd: TWSAData;
S: Integer;
SockAddr: TSockAddrIn;
begin
Result := ABeginPort;
if WSAStartup(MAKEWORD(2, 2), Wsd) <> 0 then
Exit;
try

if ATCP then
S := Socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)
else
S := Socket(AF_INET, SOCK_DGRAM, IPPROTO_IP);

if S = SOCKET_ERROR then
Exit;

SockAddr.sin_family := AF_INET;
SockAddr.sin_addr.S_addr := inet_addr(pchar(GetIP(false)));
SockAddr.sin_port := htons(ABeginPort);
while bind(S, @SockAddr, SizeOf(SockAddr)) = SOCKET_ERROR do
begin
inc(ABeginPort);
SockAddr.sin_port := htons(ABeginPort);
end;
closesocket(S);

finally
Result := ABeginPort;
end;
end;
 
接受答案了.
 
后退
顶部