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