一、前期準(zhǔn)備
本文主要講解CAPL語言里是如何實(shí)現(xiàn)TCP連接通信的,所以在本文開始前需要一些前期準(zhǔn)備。
1、首先是需要了解TCP的報文格式,連接三次握手,斷開連接四次揮手的相關(guān)知識,推薦以下兩位博主文章。
深入淺出TCP三次握手 (多圖詳解)
兩張動圖-徹底明白TCP的三次握手與四次揮手
2、Canoe自帶實(shí)現(xiàn)TCP連接的CAPL例程,以及在幫助文檔里有對TCP接口進(jìn)行相關(guān)的說明,本文以例程為例,對邏輯進(jìn)行梳理,進(jìn)行相關(guān)更改。
例程路徑:C:\Users\Public\Documents\Vector\CANoe\Sample Configurations 16.0.145\Ethernet\Simulation\TCPBasicCAPL
說明文檔路徑:Ethernet>TCP/IP API
3、在說明文檔里可以看到創(chuàng)建客戶端和服務(wù)端套接字流程以及TCP API函數(shù)的使用說明。
先了解下簡要流程,具體函數(shù)使用往后繼續(xù)講解。
在客戶端,需先使用TcpOpen創(chuàng)建一個Socket(套接字)綁定地址和端口,TcpOpen函數(shù)創(chuàng)建完端口后,會返回一個句柄,這個句柄可供后續(xù)相關(guān)TCP的API函數(shù)使用。然后使用TcpConnect函數(shù)便可將創(chuàng)建的客戶端Socket向目的地址和目的端口(服務(wù)端Socket)發(fā)起連接。
在服務(wù)端,也是使用TcpOpen創(chuàng)建一個Socket。而服務(wù)端還需使用TcpListen監(jiān)聽函數(shù),來等待連接,如果收到連接請求,會回調(diào)OnTcpListen函數(shù),在OnTcpListen函數(shù)里需要使用TcpAccept函數(shù)對連接請求進(jìn)行接受,TcpAccept函數(shù)在接受請求后會重建一個新的Socket用于連接通訊。也就是服務(wù)端會有兩個端口,一個是服務(wù)器端口,用于接收連接請求,一個是連接端口,用于連接建立好后進(jìn)行與客戶端的通訊。
而端口的關(guān)閉均使用TcpClose函數(shù)。
二、TCP連接流程實(shí)現(xiàn)
1、打開工程
我們打開示例工程看看是如何進(jìn)行TCP連接模擬的。
首先看到Setup桌面面板,有兩個節(jié)點(diǎn)分別是Server和Client。Start Value里是對一些變量的值初始化。
接著看到Simulation桌面面板,里面有Server和Client兩個操作面板。
2、運(yùn)行演示
先看下Start Value面板里的賦值順序,Listen賦值為0,Connect賦值為0,TxText初始化會“Hello World”,RxText初始化清空。點(diǎn)擊閃電Start圖標(biāo)運(yùn)行,可以看到Listen鍵置灰,Connect鍵置灰,TxText文本框里有“Hello World”字符串,點(diǎn)擊Send發(fā)送,原本清空的RxText框收到了“Hello World”字符串。并且在trace窗口,可以看到tcp三次握手連接的報文以及傳輸“Hello World”字符串發(fā)送和應(yīng)答報文。
3、代碼對應(yīng)
根據(jù)運(yùn)行演示的步驟,來具體看看CAPL代碼里的實(shí)現(xiàn)。
首先看看按下服務(wù)端按下Listen按鍵觸發(fā)的操作。
TCP棧的位置,以及客戶端和服務(wù)端ip地址的設(shè)置。
服務(wù)端開啟監(jiān)聽后,客戶端Connect按鍵按下發(fā)起主動連接。
客戶端用了Connect函數(shù)后便會發(fā)送連接請求,收到服務(wù)端的第一幀應(yīng)答后,也就是第二次握手后,接著會觸發(fā)OnTcpConnect函數(shù)。
第三次握手后,會觸發(fā)OnTcpListen監(jiān)聽函數(shù),創(chuàng)建一個新的連接socket進(jìn)行通信。
連接完成后,服務(wù)端點(diǎn)擊send按鈕進(jìn)行發(fā)送,觸發(fā)相關(guān)事件,并用連接socket進(jìn)行消息的發(fā)送。
在服務(wù)端發(fā)送信息后,則會觸發(fā)客戶端接收回調(diào)函數(shù)的使用,進(jìn)行消息的接收。
最后再看看關(guān)閉函數(shù),就是直接調(diào)用close函數(shù),服務(wù)端close會觸發(fā)客戶端回調(diào)OnTcpClose,客戶端close會觸發(fā)服務(wù)端回調(diào)OnTcpClose。
4、客戶端向服務(wù)端發(fā)送消息
源碼里已經(jīng)有服務(wù)端向客戶端發(fā)送消息的代碼了,那客戶端怎么向服務(wù)端發(fā)送消息,直接用客戶端socket調(diào)用send函數(shù)就可以了,因?yàn)檫B接已經(jīng)建立好,所以不用指定服務(wù)端的連接socket。
服務(wù)端在OnTcpReceive函數(shù)里對接收數(shù)據(jù)進(jìn)行處理。
補(bǔ)充:
CAPL提供兩種API的使用方式,如下圖,一種是函數(shù)形式,一種是方法形式。上面例子均使用的是方法形式,即定義了一個TcpSocket的數(shù)據(jù)類型gSocket,直接用gSocket這個數(shù)據(jù)對象去調(diào)用send函數(shù)或其他函數(shù)。
如要使用函數(shù)形式,則需要先用TcpOpen函數(shù)先創(chuàng)建一個socket,TcpOpen會返回一個dword數(shù)據(jù)類型的句柄,在使用其他函數(shù)時侯,如下方TcpSend時,將句柄傳入dword socket這個參數(shù)即可,其他函數(shù)類似。在程序編寫時,使用其中一種形式進(jìn)行編寫較為便利。
文章來源:http://www.zghlxwxcb.cn/news/detail-469167.html
三、總結(jié)
以上,capl里實(shí)現(xiàn)tcp連接通訊流程是,client和server用open()打開創(chuàng)建socket,服務(wù)端用listen()監(jiān)聽,客戶端用connect()去主動連接,服務(wù)端在listen()回調(diào)里用accept()接收連接請求,并創(chuàng)建一個新socket,完成連接,最后用send()即可互相通訊。而close()用于關(guān)閉連接。用好open()、listen()、connect()、accept()、close()、send()函數(shù)則tcp的三次握手、四次揮手程序自動會去實(shí)現(xiàn)。文章來源地址http://www.zghlxwxcb.cn/news/detail-469167.html
到了這里,關(guān)于Canoe CAPL語言實(shí)現(xiàn)TCP連接與通信流程(TCP相關(guān)API函數(shù)詳細(xì)使用)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!