移植libnoPoll到SylixOS遇到的问题总结
来源:互联网 发布:淘宝上氟硝西泮叫什么 编辑:程序博客网 时间:2024/06/06 00:55
1、概述
关于libnoPoll移植到SylixOS的移植过程及移植方法参考工程技术笔记《移植libnopoll到SylixOS技术笔记》。本篇文档旨在描述移植过程遇到的问题及解决问题的方法。
2、问题描述及解决方法
2.1 编译提示未定义选项
在完成libnoPoll库工程的创建后,在编译时提示“'SO_BINDTODEVICE'undeclared (first use in this function)”,经过查阅资料得知‘SO_BINDTODEVICE’是一个套接字选项,该选项用于将套接口绑定到指定的网络接口上。一般用于实现多网口负载均衡的方法。通常调用setsockopt接口对某个套接口进行套接字选项的设置。
程序清单2.1 setsockopt函数原型
#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 套接字选项列表
在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有没有可替换的方案,如果没有的话,现阶段是以裁剪为主。删去不必要的功能。
- 移植libnoPoll到SylixOS遇到的问题总结
- 移植libnopoll到SylixOS技术笔记
- 移植libffi到SylixOS
- SylixOS中间件移植方法总结
- SylixOS移植Redis库总结
- eV3, eV4 移植到VS2005过程中遇到的问题, 总结
- wifi无线网卡(zd1211b芯片)移植到mini2440全过程(二)遇到的问题总结&&解决方案
- SylixOS的LCD驱动移植
- 移植遇到的问题
- Vxworks工程移植到SylixOS应用笔记
- Socket 编程 windows到Linux代码移植遇到的问题
- 移植代码到 DLL 时遇到的一个问题
- 移植OSBench.exe源码到BSP遇到的问题
- Socket 编程 windows到Linux代码移植遇到的问题
- Socket 编程 windows到Linux代码移植遇到的问题
- 将开源libosmscout移植到QNX遇到的问题和解决方法
- Windows到Linux系统代码移植遇到的问题
- 移植bootloader到2440中遇到的问题
- Java反编译工具Jad详解
- Java InputStream、String、File相互转化
- pickup 类的使用
- Java 使用注解校验身份证号
- jmeter数据库链接池压力测试
- 移植libnoPoll到SylixOS遇到的问题总结
- JavaWeb--浅谈Httpsession和cookie
- Python学习基本数据类型(三)
- PHP菜鸟-最近在自学PHP,发现一个问题!
- SSD(single shot multibox detector)算法及Caffe代码详解
- 线程锁/进程锁/文件锁
- ExitProcess与TerminateProcess
- bzoj3295 动态逆序对【树状数组套权值线段树】
- web缓存与304