移植libnoPoll到SylixOS遇到的问题总结

一、概述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原型分析:操作系统

  • 此函数成功时返回0,失败时返回-1并设置错误号;
  • 参数s是套接字(socket函数返回);
  • 参数level是选项等级如表 2.1所示;
  • 参数optname是选项名如表 2.1所示;
  • 参数optval是选项值;
  • 参数optlen是选项长度。

        经过调用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手册中,有以下三点结论:

  • 对于TCP套接口、UDP套接口、RAW套接口,能够经过SO_BINDTODEVICE套接口选项将套接口绑定到指定的网络接口上。绑定以后,套接口的全部数据包收发都只通过指定的网络接口。
  • 对于PACKET类型的套接口,不能经过SO_BINDTODEVICE绑定到指定的网络接口上,而要经过bind接口来与特定的网络接口绑定,所用的套接口地址结构为struct sockaddr_ll,此套接口地址结构是链路层的地址结构,独立于具体的网络设备。好比,该地址结构既能够用于表示PPP设备,也能用于表示Ethernet设备。
  • SO_BINDTODEVICE套接口选项只适用于Linux系统。若是要编写运行在多操做系统平台上的程序,不能依赖SO_BINDTODEVICE来完成套接口与具体设备的绑定。

        经过阅读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有没有可替换的方案,若是没有的话,现阶段是以裁剪为主。删去没必要要的功能。

相关文章
相关标签/搜索