您的位置:首页 > 理论基础 > 计算机网络

c++builder上使用TIDTCPServer和TIDTCPClient进行简单通信,如何通过代码动态设置TIDTCPServer的Bindings属性。

2013-03-26 10:49 831 查看
这两天老大让我实现一个简单功能就是通过代码动态设定TIDTCPServer的Bindings属性,刚开始我觉得这个问题So Easy,但是做着做着总是出现同样一个错误不知道为什,这个问题一直纠结了我两天时间终于在今天早上得以解决,在此同大家分享一下在这个过程中我是如何解决这问题的,同时也给以后遇到同样问题的朋友做个参考。

1、首先我让然大家看一下我做得简单demo的界面



其功能时当点击btn1时客户端给服务器发送hello,服务器在接受请求时把接收到的字符串赋给在Edit1编辑框。

2、在让大家看看TIDTCPServer的属性设置。



3、接下来在看看我的代码实现

void __fastcall TForm1::btn1Click(TObject *Sender)

{

if(this->idtcpclnt1->Connected() == false)

{

this->idtcpclnt1->Port = 5050;

this->idtcpclnt1->Host = "127.0.0.1";

this->idtcpclnt1->Connect();

}

this->idtcpclnt1->IOHandler->WriteLn("hello");

}

void __fastcall TForm1::FormCreate(TObject *Sender)

{

this->idtcpsrvr1->Bindings->Items[0]->Port = 5050;

this->idtcpsrvr1->Bindings->Items[0]->IP = "127.0.0.1";

this->idtcpsrvr1->Bindings->Items[0]->IPVersion = Id_IPv4;

}

就是这样一段简单那的代码,却重复出现同样的错误,经过跟踪每次在this->idtcpclnt1->Connect();时总是出现如下的错误:



在网上查这个错误得知:因为目标主机主动拒绝,连接不能建立。这通常是因为试图连接到一个远程主机上不活动的服务,如没有服务器应用程序处于执行状态。明明设置了为什么会出现这样的错误,我很纳闷,起初我怀疑是不是不能动态设置Bindings的属性呢!但是在API上查到是可以实现的,所以我打消了不能实现的怀疑心态,就开始找原因,我把可能出现的原因做了总结

1、通过对比的方式,跟踪查看变量值,看看在IDE上设置Bindings属性和通过代码实现的某些区别。

2、是不是代码本身就不正确,从而导致出现以上错误。

3、在确定就是通过这样方式实现的话,看是不是缺少某些关键性代码,所以出错。

针对以上这三点我主意进行排查,得到的结果是

1、对比不出什么问题。

2、既然对比不出问题,我就试着改变实现的的代码如下:

TIdSocketHandle *sh = this->idtcpsrvr1->Bindings->Add();

sh->Port = 5050;

sh->IP = "127.0.0.1";

sh->IPVersion = Id_IPv4;

主意这段代码是替换FormCreate(TObject *Sender)函数中的代码,但是运行后还是出现上面的问题。

3、换了代码还是出现问题,但是要确定你替换的代码,在理论上是讲的通的,具有可行性,如果没有依据那么还要继续修改替换代码。我确定就是这种方式,但是出错,我 就想是不是缺少某些关键性代码。结果我加了一行代码如下:

this->idtcpsrvr1->Bindings->Clear();

TIdSocketHandle *sh = this->idtcpsrvr1->Bindings->Add();

sh->IP = "127.0.0.1";

sh->Port = 5050;

sh->IPVersion = Id_IPv4;

但运行跟踪到this->idtcpsrvr1->Bindings->Clear();这行运行完,会出现另外一个错误如下:



此时我就更纳闷了,上一个问题没有解决,新的问题又出现了,是不是加的不正确,经过在网上查看到一篇博客也是这样写的,就多了一行,于是我又给加了一行代码如 下:

this->idtcpsrvr1->Bindings->Clear();

TIdSocketHandle *sh = this->idtcpsrvr1->Bindings->Add();

sh->IP = "127.0.0.1";

sh->Port = 5050;

sh->IPVersion = Id_IPv4;

this->idtcpsrvr1->Active = true;

结果又出现同样一个错误如下:



这下,有头大了, 注意越是在这种情况下,越要相信这是可行的,这就越离成功不远了。在网上查10038这个错误得到如下结论:操作试图不是在套接字上进行。它可能 是套接字句柄参数没有引用到一个合法套接字,或者是调用select()函数时,一个fd_set中的成员不合法。此时我就在想为什么报出这样的错误?突然我想是不是我在IDE 上设置TIDTCPServer属性Active的问题,此时我就诞生一个想法:你都把它给激活了,等于它已经开启监听了,此时你在clear,是不是不合理。于是我就沿着这个思路,
先把IDE中的Active属性给置为false,让他先不活动,再试试可行不可行。经过调试是可行的。此时我很激动,终于好了,问题找到了。结果是:



4、这个问题就是这样解决的,当然不是上面文字所能表达完的,在这过程中我也走了不少弯路。所以我再次总结一下遇到问题时的我们应该如何解决:

1、首先要确认这个问题是不是可以解决,要查资料。

2、如果可以解决,再看看问题出在哪儿,这个问题实质是什么。

3、弄清问题的实质,再看看自己处理的是否恰当,如果不恰当要另寻解决方案。

4、每换一种解决方案时,要确认这种解决方案的可行性,要论证它。

5、如果解决方案一旦确定还出现问题,那就要综合考虑,那一部分可能出现小小问题,此时离问题解决已经不远了。

6、找出这个小问题,那么就解决了整个大问题。

5、这是我的心得,如果哪位朋友有什么好的意见请留言,或者发到我的邮箱t_x_k@sina.com,谢谢观看。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐