一个BCB中异常处理的问题

tuhuo 2007-04-02 08:34:08
问题是这样的,在设置IdUDPServer的DefaultPort属性时,因为我不知道哪些端口是可用的,所以给出一个端口值下界,然后从这个值开始不断尝试,直到找到一个能用的端口,代码如下:
------------------------------------------------------
udpPort = udpPortLow;//从5000开始尝试
bool bKeepDetect;//是否继续尝试
do {
bKeepDetect = false;
try {
UDPServer->DefaultPort = udpPort;
UDPServer->Active = true;
} catch(const EIdCouldNotBindSocket& e) {
mmStatus->Lines->Add(IntToStr(g_lSeqNum++) + ":" + e.Message);
++udpPort;//尝试下一端口
bKeepDetect = true;
}
}while(bKeepDetect);
--------------------------------------------------------
当我运行第一个实例时,获得的端口是5000,以后所有实例获得的端口都是5001,也就是发生异常后就跳出循环了。而且,调试的时候,似乎没有办法进入我自己的异常处理部分,一旦发生异常,就被调试器直接捕获了,所以我也没办法进行调试。

请大虾指点一下这段代码应该怎么写,还有就是怎么样设置可以在调试时进入自己的异常处理,谢谢!
...全文
270 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tuhuo 2007-04-05
  • 打赏
  • 举报
回复
看了一个Indy9的Demo,终于知道怎么回事了
------------------------------------------------------
udpPort = udpPortLow;//从5000开始尝试
bool bKeepDetect;//是否继续尝试
do {
bKeepDetect = false;
try {
UDPServer->Active = false;
UDPServer->Bindings->Clear();
UDPServer->DefaultPort = udpPort;
UDPServer->Active = true;
} catch(const EIdCouldNotBindSocket& e) {
mmStatus->Lines->Add(IntToStr(g_lSeqNum++) + ":" + e.Message);
++udpPort;//尝试下一端口
bKeepDetect = true;
}
}while(bKeepDetect);
tuhuo 2007-04-03
  • 打赏
  • 举报
回复
对了, 问一下

while(!pSocket->Connect(IP,nPort))
{
delete pSocket;
pSocket=NULL;
return false;
}

为什么要用while循环而不是if呢?
tuhuo 2007-04-03
  • 打赏
  • 举报
回复
谢谢热心的huzhangyou,我把BCB异常处理的部分再翻翻,看看能不能解决这个问题。
huzhangyou 2007-04-03
  • 打赏
  • 举报
回复
单独的函数也可以这么写
BOOL CenumhostsDlg::TestConnection(CString IP, UINT nPort)
{
CSocket* pSocket;
pSocket=new CSocket();
ASSERT(pSocket);
if(!pSocket->Create())
{
delete pSocket;
pSocket=NULL;
return false;

}

while(!pSocket->Connect(IP,nPort))
{
delete pSocket;
pSocket=NULL;
return false;
}

pSocket->Close();
delete pSocket;

return true;
}

当然这是VC的
huzhangyou 2007-04-03
  • 打赏
  • 举报
回复
比如
bool TestPort(list<int> &iListPort){
CreateProcess //或者ShellExecute等等执行netstat -an然后分析返回的数据
再将得到的数据压入iListPort
}
huzhangyou 2007-04-03
  • 打赏
  • 举报
回复
比如你可以使用获得netstat -an命令
通过管道获取他的输出
然后分析得到他没有使用的端口


这样我觉得更划算
huzhangyou 2007-04-03
  • 打赏
  • 举报
回复
我觉得你的结构会有问题

可以写一个专门的小函数来测试端口的开放情况
然后如果可以使用 就放到一个List或者VECTOR中保存
备用

1,316

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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