一、概述shell
關於libnoPoll移植到SylixOS的移植過程及移植方法參考工程技術筆記《移植libnopoll到SylixOS技術筆記》。本篇文檔旨在描述移植過程遇到的問題及解決問題的方法。網絡
二、問題描述及解決方法負載均衡
2.1 編譯提示未定義選項socket
在完成libnoPoll庫工程的建立後,在編譯時提示「'SO_BINDTODEVICE'undeclared (first use in this function)」,通過查閱資料得知‘SO_BINDTODEVICE’是一個套接字選項,該選項用於將套接口綁定到指定的網絡接口上。通常用於實現多網口負載均衡的方法。一般調用setsockopt接口對某個套接口進行套接字選項的設置。函數
在SylixOS中setsockopt函數原型如程序清單2.1所示。測試
程序清單2.1 setsockopt函數原型this
#include <sys/socket.h> int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
函數setsockopt原型分析:操作系統
經過調用setsockopt函數來設置不一樣選項等級的不一樣選項,參數optval是一個指向變量的指針類型,根據不一樣的選項,類型也不一樣。指針
表2.1 套接字選項列表code
在libnoPoll中的調用如程序清單 2.2所示。
程序清單2.2 調用關係
setsockopt (socket, SOL_SOCKET, SO_BINDTODEVICE, options->_interface, strlen (options->_interface));
對於'SO_BINDTODEVICE'套接字選項,在Linux的man手冊中,有以下三點結論:
經過閱讀SylixOS的源碼並由第三點結論可知,在SylixOS下並無提供該套接字選項,在沒有指定該套接字選項的狀況下,每次在發送數據包以前,內核會先查找路由表從而決定從哪一個網絡接口上發送數據包。所以,爲了可以保證工程可以正確編譯,須要將該套接口選項剪裁掉。剪裁後的libnoPoll將再也不具備實現多網口負載均衡的功能。
2.2 測試用例運行時出錯
在libnoPoll的測試代碼中會使用system函數來運行某些shell命令,但有些shell命令在SylixOS下並不支持或支持相同功能但shell命令名不一樣,所以,在測試代碼運行過程當中有可能會出錯,遇到這種狀況,可根據具體狀況修改libnoPoll中提供的測試代碼。
在RealEvo IDE的base工程中,默認會有libcextern(SylixOS C庫)和libsylixos(SylixOS內核組件)這兩個工程文件夾,在編譯base工程後會生成C庫文件和內核庫文件。在測試用例運行失敗後,經過跟蹤源代碼,發如今C庫和內核庫中都同時定義了getaddrinfo接口。默認狀況下,在應用程序沒有指定引用哪一個庫文件時,編譯時會使用內核庫中定義的函數。在工程屬性中能夠從新設置引用的庫文件,經過將應用程序從新指定使用C庫以後,從新編譯應用程序,再次部署就可以正常運行。
2.3 總結
因爲大多數移植的中間件是從Linux下的工程移植過來的,所以,對於SylixOS不支持的特性,一般作法是看SylixOS有沒有可替換的方案,若是沒有的話,現階段是以裁剪爲主。刪去沒必要要的功能。