基于SOCK盯編程實(shí)現(xiàn)的組態(tài)軟件與控制器的網(wǎng)絡(luò)通訊
本系統(tǒng)中,工程師站組態(tài)軟件一般可作為客戶端向控制器發(fā)送連接請(qǐng)求,以建立連接。由于控制器采集數(shù)據(jù)是周期性的,組態(tài)軟件采用異步選擇機(jī)制判斷控制器是否有數(shù)據(jù)發(fā)送過來。Windows Sockets的異步選擇函數(shù)提供了消息機(jī)制的網(wǎng)絡(luò)事件選擇功能,當(dāng)它所登記的網(wǎng)絡(luò)事件發(fā)生時(shí),應(yīng)用程序相應(yīng)的窗口會(huì)收到一個(gè)消息,消息中指明了所發(fā)生的網(wǎng)絡(luò)事件以及與該網(wǎng)絡(luò)事件相關(guān)的一些信息。
連接建立之后,即可調(diào)用Winsock提供的函數(shù)來發(fā)送和接收數(shù)據(jù),進(jìn)程結(jié)束時(shí),則關(guān)閉兩個(gè)套接字。
2.2 數(shù)據(jù)交互
通訊模塊主要與框架、在線兩個(gè)模塊以及控制器存在數(shù)據(jù)交互。圖3所示是其通訊模塊與組態(tài)軟件的其它模塊及控制器之間進(jìn)行數(shù)據(jù)交互的流程圖。其中,通訊模塊發(fā)送給框架窗口的消息主要有三項(xiàng)功能:一是通知在線模塊讀取控制器返回的應(yīng)答數(shù)據(jù);二是在通訊中出現(xiàn)異常時(shí),返回錯(cuò)誤信息;三是在通訊出現(xiàn)超時(shí)時(shí),返回超時(shí)信息。
2.3 數(shù)據(jù)傳輸協(xié)議
TCP/IP協(xié)議族的核心部分是傳輸層和網(wǎng)絡(luò)層。傳輸層主要為應(yīng)用程序提供端到端的通信,TCP/IP協(xié)議族有兩個(gè)互不相同的傳輸協(xié)議,即TCP(傳輸控制協(xié)議)和UDP(用戶數(shù)據(jù)報(bào)協(xié)議)。
TCP是一種面向連接的協(xié)議,它可給用戶進(jìn)程提供可靠的全雙工的數(shù)據(jù)通信,其所做的工作是把應(yīng)用程序交給它的數(shù)據(jù)分成合適的小塊交給下面的網(wǎng)絡(luò)層,同時(shí)確認(rèn)接收到的分組,并提供流量控制、設(shè)定超時(shí)及重傳等機(jī)制。由于TCP提供有高可靠性的端到端的通信,因此,應(yīng)用程序可以忽略所有這些細(xì)節(jié)。
Winsock的Nagle算法會(huì)降低小數(shù)據(jù)包的發(fā)送速度,因此應(yīng)當(dāng)定義一種數(shù)據(jù)結(jié)構(gòu),以將發(fā)送的數(shù)據(jù)按照這種數(shù)據(jù)結(jié)構(gòu)以字符型ASCII發(fā)送,客戶端接收到服務(wù)器傳來的數(shù)據(jù),按照這種數(shù)據(jù)結(jié)構(gòu)解析數(shù)據(jù),這樣做可以減少小數(shù)據(jù)包的數(shù)目,避免協(xié)議使用Nagle算法。此外通過消息響應(yīng)代替輪詢也是提高傳輸實(shí)時(shí)性的一種措施。
2.4 阻塞的預(yù)防及處理
TCP/IP協(xié)議本身的滑動(dòng)窗口控制可以有效的防止阻塞的發(fā)生。假設(shè)服務(wù)器和客戶端的收發(fā)緩沖區(qū)大小為100 K字節(jié),服務(wù)器每發(fā)送一個(gè)大小為80 K字的數(shù)據(jù)包,客戶端接收到這個(gè)數(shù)據(jù)包后,將返回一個(gè)應(yīng)答,應(yīng)答中包含有下次服務(wù)器能夠發(fā)送的最大的字節(jié)數(shù),即下次服務(wù)器只能發(fā)送大小不能超過20 K字的數(shù)據(jù)。按照這種控制方法,TCP/IP可根據(jù)滑動(dòng)窗口的大小控制發(fā)送的速度,滑動(dòng)窗口大,則發(fā)送的數(shù)據(jù)量大,滑動(dòng)窗口過小,則發(fā)送的數(shù)據(jù)量也會(huì)減小,這樣即可以防止阻塞的發(fā)生。
該通訊模塊中使用的防阻塞方法是在同步方式中采用select函數(shù)來檢查接收發(fā)送緩沖區(qū)的讀寫可用狀態(tài)。服務(wù)器端發(fā)送數(shù)據(jù)前,應(yīng)先檢查服務(wù)器的發(fā)送緩沖區(qū)是否可寫,如不可寫,說明發(fā)送緩沖區(qū)己經(jīng)寫滿,需要等待發(fā)送緩沖區(qū)有剩余空間時(shí)再發(fā)送,以避免阻塞。同樣,客戶端在讀緩沖區(qū)數(shù)據(jù)前,也應(yīng)先檢查一下緩沖區(qū)是否可讀。如果發(fā)送緩沖區(qū)一直不可寫,那么可能是因?yàn)榫W(wǎng)絡(luò)斷開,或者網(wǎng)絡(luò)負(fù)載過大,使數(shù)據(jù)不能發(fā)送出去。
設(shè)置一個(gè)超時(shí)時(shí)限,可以阻塞發(fā)生時(shí),當(dāng)發(fā)送緩沖區(qū)不可寫的狀態(tài)超過設(shè)置的超時(shí)時(shí)間,系統(tǒng)則重新建立一個(gè)連接。
將這種方法和TCP/IP協(xié)議本身的防阻塞控制結(jié)合使用,可以有效地防止阻塞的發(fā)生。
評(píng)論