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

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

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

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

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

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

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

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();时总是出现如下的错误:

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

在网上查这个错误得知:因为目标主机主动拒绝,连接不能建立。这通常是因为试图连接到一个远程主机上不活动的服务,如没有服务器应用程序处于执行状态。明明设置了为什么会出现这样的错误,我很纳闷,起初我怀疑是不是不能动态设置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();这行运行完,会出现另外一个错误如下:

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

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

           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;

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

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

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

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

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

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

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

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

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

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

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

5、这是我的心得,如果哪位朋友有什么好的意见请留言,或者发到我的邮箱[email protected],谢谢观看。

你可能感兴趣的:(c++builder上使用TIDTCPServer和TIDTCPClient进行简单通信,如何通过代码动态设置TIDTCPServer的Bindings属性。)