1. 程式人生 > >c++builder上使用TIDTCPServer和TIDTCPClient進行簡單通訊,如何通過程式碼動態設定TIDTCPServer的Bindings屬性。

c++builder上使用TIDTCPServer和TIDTCPClient進行簡單通訊,如何通過程式碼動態設定TIDTCPServer的Bindings屬性。

 這兩天老大讓我實現一個簡單功能就是通過程式碼動態設定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、這是我的心得,如果哪位朋友有什麼好的意見請留言,或者發到我的郵箱[email protected],謝謝觀看。

相關推薦

c++builder使用TIDTCPServerTIDTCPClient進行簡單通訊如何通過程式碼動態設定TIDTCPServer的Bindings屬性

 這兩天老大讓我實現一個簡單功能就是通過程式碼動態設定TIDTCPServer的Bindings屬性,剛開始我覺得這個問題So Easy,但是做著做著總是出現同樣一個錯誤不知道為什,這個問題一直糾結了我兩天時間終於在今天早上得以解決,在此同大家分享一下在這個過程中我是如何解

C++ Builder創建調用dll中的資源

正常 面板 apt 用戶 .com reel pro trac 引號 程序開發中經常會用到一些圖標、圖片、光標、聲音等,我們稱它們為資源(Resource)。當多個窗口用到同樣的資源時,可以將這些公共的資源放到一個dll文件裏調用,這樣,由於定位資源比在磁盤中定位文件花費時

Webbrowser進行簡單交互

class member browser tee 填充 修改 一個 函數 網頁 作為第一篇,簡單的控件使用就不說了。 直接從簡單的交互開始吧! C#使用網頁中已有的js函數 webBrowser.Document.InvokeScript("Stop");//we

利用ionic3進行一行左一行不動中間移動的功能

export nta gen 監聽事件 ole rmp child d3d center 首先在html中的寫法是 <ion-header> <ion-navbar> <ion-title>歷史數據</ion-tit

(04)C++ builder之wchar_tchar變數互轉

(同一個世界,同一個夢想,交流學習C++Builder XE10,傳承c++builder的魅力!歡迎各地朋友加入我的QQ群484979943,進群密碼“BCB”,同時也請將該群號廣為宣傳,希望能夠廣集各方高手,共同進步。如需下載開發工具及原始碼請加入我的QQ群)【閱讀倡議】

c# HttpClient下載的進度顯示問題

WebClient中有DownloadProgressChangedEventHandler等事件可以響應http請求(或者其他web請求)的進度。 在c# 5.0中,HttpClient的函式都是以Task非同步函式存在,沒有事件可以回撥顯示上傳或下載的進度。 具體示

[Android]Delphi/C++ Builder 開發 Android 程式啟動畫面簡單完美解決方案

前面和音兒一起研究 Android 下啟動畫面的問題,雖然問題得到了解決,但是,總是感覺太麻煩,主要的問題: 1、需要手工去修改XML檔案; 2、而且需要對系統本身做出修改; 3、方案還不夠完善,需要較多的步驟; 現在,經常不斷的折騰,終於找到了一個

C#socket建立伺服器並進行簡單通訊

注:本文為本人學習筆記,之前在蠻牛網上發表的。 發現說明甚少,不過都是比較基礎的操作,這裡就不再說明了。包括兩個.cs檔案,一個是作為伺服器端,一個是客戶端。 伺服器端程式碼: using Syste

c++ 的用 new delete 進行二維陣列動態記憶體的建立刪除

1.陣列指標 A (*ga)[n] = new A[m][n]; ... delete []ga; 2.二級指標 A** ga = new A*[m]; for(int i = 0; i < m; i++)

C++ Builder 源碼:TTS 文字轉語音可以朗讀文字或者把文字轉為 wav 聲音文件

源碼 img 操作 sde lan 語音 skill http sta TTSDemo / TVictorTTS: 兼容 C++ Builder 2010 ~ C++ Builder 10 (CX) 版本 ? 包括 Win32 和 Win64 兩個版本。兼容的操作系統:W

java壓縮 GZIP進行簡單壓縮ZIP進行多文件保存

div ade test ipo fill pop str tput rac java壓縮 GZIP進行簡單壓縮,ZIP進行多文件保存 package org.rui.io.compress; import java.io.BufferedOutputStrea

zedboard通過BRAM實現PSPL的簡單通訊

使用Block Memory進行PS和PL的資料互動或者資料共享,通過zynq PS端的Master GP0埠向BRAM寫資料,然後再通過PS端的Mater GP1把資料讀出來,將結果列印輸出到串列埠終端顯示。涉及到AXI BRAM Controller 和 Block Memery Generator等IP

系統延時命令(at命令crontab命令)ftp服務(服務端客戶端檔案的下載)[匿名使用者本地使用者虛擬使用者]

1.系統延遲任務 # at  命令發起的指令都是一次性的 at (+)time  ##指定命令執行的時間 at  -l  ##檢視當前任務 ad -d 3 #取消還未執行的任務(3:at -l 所看到的任務號) atrm 4 #

nodejs socket實現的服務端客戶端簡單通訊

                        本文例項講述了通

字元指標整形指標簡單分析*&的作用

你始終記住 * 就是取值的, 例:*p,你看看p中存的是什麼是地址的話就是去這個地址中存的內容,如不是抵制就返回0; 程式碼如下:     string ww="zhj";     string * dizhi=&ww;//存的地址     cout <&

從零開始學Socket:(三)服務端客戶端簡單通訊

連線上服務端和客戶端之後,我們就要讓他們互動起來了。(到了現在,大家如果對下面程式碼不懂得地方可以去F12跟蹤至原始碼介面檢視,學習就是這樣) 先在服務端編寫傳送函式和接收函式 /// <summary> /// 傳送資料到客戶

loadRunner之引數化對使用者名稱密碼進行引數化並列印輸出

錄製指令碼,對使用者名稱和密碼進行引數化: Action() { web_url("WebTours", "URL=http://127.0.0.1:1080/WebTours/", "Res

JAVA與C++進行sslsocket通訊JAVA做服務端或客戶端

一、JAVA做服務端,讀取pem格式的證書和祕鑰 <span style="font-size:18px;">public class SocketServer extends Thread{ private static final int SERVER_P

Socket程式設計服務端客戶端互相通訊實現簡單的聊天

客戶端兩個執行緒分別記錄讀和寫,服務端兩個執行緒分別記錄讀和寫; 客戶端程式碼: import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import

C# 利用Socket類實現客戶端伺服器之間的通訊可在本機之間實現資訊互動

利用Socket類實現了本機之間的客戶端與服務端的資訊互動。 伺服器: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using