1.概述
關于libnoPoll移植到SylixOS的移植過程及移植方法參考工程技術筆記《移植libnopoll到SylixOS技術筆記》。本篇文檔旨在描述移植過程遇到的問題及解決問題的方法。
創(chuàng)新互聯(lián)服務項目包括嘉魚網(wǎng)站建設、嘉魚網(wǎng)站制作、嘉魚網(wǎng)頁制作以及嘉魚網(wǎng)絡營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網(wǎng)行業(yè)的解決方案,嘉魚網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務的客戶以成都為中心已經(jīng)輻射到嘉魚省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
2、問題描述及解決方法
2.1 編譯提示未定義選項
在完成libnoPoll庫工程的創(chuàng)建后,在編譯時提示“'SO_BINDTODEVICE'undeclared (first use in this function)”,經(jīng)過查閱資料得知‘SO_BINDTODEVICE’是一個套接字選項,該選項用于將套接口綁定到指定的網(wǎng)絡接口上。一般用于實現(xiàn)多網(wǎng)口負載均衡的方法。通常調用setsockopt接口對某個套接口進行套接字選項的設置。
在SylixOS中setsockopt函數(shù)原型如下所示。
#include
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
函數(shù)setsockopt原型分析:
此函數(shù)成功時返回0,失敗時返回-1并設置錯誤號;
參數(shù)s是套接字(socket函數(shù)返回);
參數(shù)level是選項等級如下表 所示;
參數(shù)optname是選項名如下表所示;
參數(shù)optval是選項值;
參數(shù)optlen是選項長度。
通過調用setsockopt函數(shù)來設置不同選項等級的不同選項,參數(shù)optval是一個指向變量的指針類型,根據(jù)不同的選項,類型也不同。
在libnoPoll中的調用如下所示。
setsockopt (socket, SOL_SOCKET, SO_BINDTODEVICE, options->_interface, strlen (options->_interface));
對于'SO_BINDTODEVICE'套接字選項,在Linux的man手冊中,有如下三點結論:
2.2 測試用例運行時出錯
在libnoPoll的測試代碼中會使用system函數(shù)來運行某些shell命令,但有些shell命令在SylixOS下并不支持或支持相同功能但shell命令名不同,因此,在測試代碼運行過程中有可能會出錯,遇到這種情況,可根據(jù)具體情況修改libnoPoll中提供的測試代碼。
在RealEvo IDE的base工程中,默認會有l(wèi)ibcextern(SylixOS C庫)和libsylixos(SylixOS內(nèi)核組件)這兩個工程文件夾,在編譯base工程后會生成C庫文件和內(nèi)核庫文件。在測試用例運行失敗后,通過跟蹤源代碼,發(fā)現(xiàn)在C庫和內(nèi)核庫中都同時定義了getaddrinfo接口。默認情況下,在應用程序沒有指定引用哪個庫文件時,編譯時會使用內(nèi)核庫中定義的函數(shù)。在工程屬性中可以重新設置引用的庫文件,通過將應用程序重新指定使用C庫之后,重新編譯應用程序,再次部署就能夠正常運行。
2.3 總結
由于大多數(shù)移植的中間件是從Linux下的工程移植過來的,因此,對于SylixOS不支持的特性,通常做法是看SylixOS有沒有可替換的方案,如果沒有的話,現(xiàn)階段是以裁剪為主。刪去不必要的功能。