Delphi TIdUdpServer,如何打开一空闲端口

独醒子 2011-01-20 02:07:32
const
aryPort :array [0..9] of Integer=(...一些预先定义端口号...);


for i:=0 to adObj.defPortCount do
begin
udpS.DefaultPort:=aryPort[i];
try
udpS.Active:=true;
if frmmain.udpS.Active then break;
except
//也不知道这里该写些什么
end;
end;
end;

就是有个数组,放有一系列端口号。
想循环判断下是否能打开,使用第一个能打开的端口。
可程序进入循环后,第一个端口若已被占用。
则程序直接跳出循环了,咋回事啊?
该如何写?请指教。
还有这个错误捕捉该怎么完善?
(我不需要任何提示,也不做任何记录,最好调试程序时也不弹错误信息)
谢谢
...全文
227 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
BCBPLC 2011-01-29
  • 打赏
  • 举报
回复
Udp1->Bindings->Clear(); // 这样,我的毛病就消失了,松绑!!!!!!!!
独醒子 2011-01-26
  • 打赏
  • 举报
回复
我已经知道这个问题了。

原来是TIdUdpServer控件本身的问题。
当设置一个端口号,测试是否能打开之后。
修改另一个端口号,再测试是否能打开,
此时这个控件的端口号并没有修改。仍然测试的是第一次设置的端口号。
修改这段代码也很简单。
就是 先不设置udpS的端口号,调用一个函数去循环检测端口号
此函数在内部临时创建一个idudpServer控件,设置端口号。函数执行完删除。
函数返回个bool值。 若此端口号未被占用 则将udpS设置此端口号并使用。

真奇怪啊,
TIdUdpServer控件的DefaultPort属性,第一次赋值测试后。
再重新赋值新的端口号数值,属性结果也的确是新的端口号数值,
可打开端口时仍然是第一次使用的端口号
BCBPLC 2011-01-23
  • 打赏
  • 举报
回复
void __fastcall TForm1::Button2Click(TObject *Sender)
{
Udp1->Active=false;
Udp1->Bindings->Clear(); // 这样,我的毛病就消失了,松绑!!!!!!!!
Udp1->DefaultPort=Port0->Text.ToInt();
Udp1->Active=true;
}
BCBPLC 2011-01-21
  • 打赏
  • 举报
回复
TNMUDP
与dUDPServer,这两个第三方的UDP控件虽很好用,但各有缺点,
前者的缺点没法知道UDP端口是否被占用,不报错,若已被占用就
改另外端口,多少也不能直接知道。
后者,虽没有此缺点,但好象有另外缺点,如:一旦端口打开,关闭
再打开就不通迅。我宁肯用TNMUDP。



独醒子 2011-01-20
  • 打赏
  • 举报
回复
只是一个异常处理的方式 难道没人会么?
独醒子 2011-01-20
  • 打赏
  • 举报
回复
我是用这个控件,在10个端口中找到1个空闲的开始监听。

程序会启动1-10个副本,各自找到一个空闲的端口监听。

同时互相也会通信
UndefinedCoder 2011-01-20
  • 打赏
  • 举报
回复
既然你是做server,最好要固定端口啊。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧