1.概述
关于libnoPoll移植到SylixOS的移植过程及移植方法参考工程技术笔记《移植libnopoll到SylixOS技术笔记》。本篇文档旨在描述移植过程遇到的问题及解决问题的方法。
2、问题描述及解决方法
2.1 编译提示未定义选项
在完成libnoPoll库工程的创建后,在编译时提示“'SO_BINDTODEVICE'undeclared (first use in this function)”,经过查阅资料得知‘SO_BINDTODEVICE’是一个套接字选项,该选项用于将套接口绑定到指定的网络接口上。一般用于实现多网口负载均衡的方法。通常调用setsockopt接口对某个套接口进行套接字选项的设置。
在SylixOS中setsockopt函数原型如下所示。
#include
int setsockopt(int s, int level, int optname, const void *optval, socklen_t optlen);
函数setsockopt原型分析:
此函数成功时返回0,失败时返回-1并设置错误号;
参数s是套接字(socket函数返回);
参数level是选项等级如下表 所示;
参数optname是选项名如下表所示;
参数optval是选项值;
参数optlen是选项长度。
通过调用setsockopt函数来设置不同选项等级的不同选项,参数optval是一个指向变量的指针类型,根据不同的选项,类型也不同。
在libnoPoll中的调用如下所示。
setsockopt (socket, SOL_SOCKET, SO_BINDTODEVICE, options->_interface, strlen (options->_interface));
对于'SO_BINDTODEVICE'套接字选项,在Linux的man手册中,有如下三点结论:
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有没有可替换的方案,如果没有的话,现阶段是以裁剪为主。删去不必要的功能。
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
售后响应及时
7×24小时客服热线数据备份
更安全、更高效、更稳定价格公道精准
项目经理精准报价不弄虚作假合作无风险
重合同讲信誉,无效全额退款