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