使用idtcpclient时,如果boundport不设置为0的话,下次启动程序时,出现端口被占用的异常,要过几分钟后才能运行程序.怎么办?(52分)

  • 主题发起人 主题发起人 koy0755
  • 开始时间 开始时间
K

koy0755

Unregistered / Unconfirmed
GUEST, unregistred user!
使用idtcpclient时,如果boundport不设置为0的话,设置为指定的端口如(1555),第一次运行时没问题,如果关闭程序然后再启动程序时,出现端口被占用的异常(socket error # 10048 address already in use),要过几分钟后才能运行程序.indy不通自动释放端口的吗?难道我们把boundport设为0,让它自已随机找端口,他在free的时候也是没有马上把端口释放?

我现在应该怎么做?我的程序要求一定要指定客户端的端口,哎~```怎么办? 
 
不会呀,我用了很久,没有这种现象。
是不是楼主的版本太低那?我用的是9.0.1
 
会不会因为我用来接收数据的线程没有补释放所以造成这种原因呢?
 
有这可能,试试我这个方法(在系统退出的时候)
try
FList := IdTCPServer.Threads.LockList;
try
with FList do
for i := 0 to Count - 1 do
begin szErrCode := '60012';
szTmp := szTmp + '<' + TIdPeerThread(Items).Connection.Socket.Binding.PeerIP + '> '; szErrCode := '60010';
if TIdPeerThread(Items).Data <> nil then
begin
FreeSockThrd(TSockThrd(TIdPeerThread(Items).Data)); szErrCode := '60013'; // 释放发送数据线程
TIdPeerThread(Items).Data := nil; szErrCode := '60014';
end;
TIdPeerThread(Items).Connection.Disconnect(); szErrCode := '60015'; // 断开所有客户端连接
end;
// 在NT日志中记录未断开客户端IP
if FList.Count > 0 then
LogMessage('正在断开于机顶盒的连接,未断开的机器 ' + szTmp + #13
+ '个数: ' + IntToStr(FList.Count), EVENTLOG_INFORMATION_TYPE, 0, 0); szErrCode := '60016';
finally
IdTCPServer.Threads.UnlockList; szErrCode := '60011';
end;
 
你可以使用NetStat.exe查看一下,就可以发现连接不会在你的程序结束以后马上释放使用或建立次连接的线程,当Netstat.exe显示结果中没有了你的连接时,这时候就又可以用原端口连接了.这可能和线程释放(终止)有关,如果本地不使用固定端口,那在连接断开或程序退出后过一会儿,系统就会完全释放原端口的连接了.我估计可能和系统线程管理或调度有关系.
Windows附带的很多程序好象也存在这问题,他们一般都不使用固定的本地端口.
你可以用NetStat.exe查一查系统中的网络连接,试一试
 
为什么我用线程接收数据老是出错。
 
后退
顶部