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