1 onps栈使用说明——API接口手册( 三 )


原型
PST_NETIF netif_get_by_name(const CHAR *pszIfName);
入口参数

  • pszIfName:指向网卡名称的指针
返回值
存在则返回指向网卡控制块ST_NETIF的指针;否则返回NULL 。
示例

返回目录
buddy_alloc功能
向内存管理单元(mmu)申请一块指定大小的内存 。
原型
void *buddy_alloc(UINT unSize, EN_ONPSERR *penErr);
入口参数
  • unSize:申请分配的内存大小,单位:字节
  • penErr:指向错误编码的指针,当函数执行失败,该参数用于接收实际的错误码
返回值
申请成功返回内存首地址;反之则返回NULL,具体错误信息参见 penErr参数携带的错误码 。
示例
参见buf_list_merge_packet函数示例或上一篇博文《onps栈移植说明(3)——添加网卡》 。
返回目录
buddy_free功能
归还(释放)先前通过buddy_alloc()函数申请的内存 。
原型
BOOL buddy_free(void *pvStart);
入口参数
  • pvStart:指向要归还的内存首地址的指针
返回值
成功归还内存返回TRUE;当pvStart指向的并不是buddy_alloc()函数返回的内存首地址时则返回FALSE 。
示例
参见buf_list_merge_packet函数示例 。
返回目录
buf_list_get_next_node功能
按链接顺序从链表首部逐个取出链表节点 。
原型
void *buf_list_get_next_node(SHORT *psNextNode, USHORT *pusDataLen);
入口参数
  • psNextNode:指向链表下一个节点的指针
  • pusDataLen:指向数据长度的指针,出口参数,其用于接收节点携带的数据长度
返回值
如果尚未到达链表尾部,则返回当前链表节点携带的数据的首地址;反之则返回NULL 。
示例
参见上一篇博文《onps栈移植说明(3)——添加网卡》 。
返回目录
buf_list_get_len功能
统计链表所有节点携带的数据长度之和 。
原型
UINT buf_list_get_len(SHORT sBufListHead);
入口参数
  • sBufListHead:链表首地址
返回值
返回链表所有节点携带的数据长度之和 。
示例
参见buf_list_merge_packet函数示例或上一篇博文《onps栈移植说明(3)——添加网卡》 。
返回目录
buf_list_merge_packet功能
从链表首节点开始顺序取出数据将其放入用户指定的缓冲区,把零散的链表数据合并成一块连续数据 。
原型
void buf_list_merge_packet(SHORT sBufListHead, UCHAR *pubPacket);
入口参数
  • sBufListHead:链表首地址
  • pubPacket:指向用户缓冲区的指针,其用于接收合并后的数据以返回给用户使用
返回值

示例
EN_ONPSERR enErr;UINT unDataLen = buf_list_get_len(sBufListHead /* 链表首地址 */);UCHAR *pubBuf = (UCHAR *)buddy_alloc(unDataLen, &enErr); //* 申请一块缓冲区用于保存合并后的数据if(pubBuf){//* 合并,合并后的数据保存在了pubBuf中,数据长度为unDataLenbuf_list_merge_packet(sBufListHead, pubBuf);//* 在这里增加你自己的代码处理合并合并后的数据……//* 处理完毕,释放刚才申请的内存buddy_free(pubBuf);}返回目录
2. Berkeley sockets协议栈提供的伯克利套接字(Berkeley sockets)并不是严格按照传统socket标准设计实现的,而是我根据以往socket编程经验,以方便用户使用、简化用户编码为设计目标,重新声明并定义的一组常见socket接口函数 。协议栈简化了传统BSD socket编程需要的一些繁琐操作,将一些不必要的操作细节改为底层实现,比如select/poll模型、阻塞及非阻塞读写操作等 。简化并不意味着推翻,socket接口函数的基本定义、主要参数、使用方法并没有改变,你完全可以根据以往经验快速上手并熟练使用onps栈sockets 。这一点相信你已经从前面的测试代码中得到了佐证 。       socket层所有接口函数的实现源码被封装在了单独的一个文件中,参见bsd/socket.c 。其对应的头文件socket.h有这些接口函数的定义和说明 。目前协议栈提供的socket接口函数有十几个,能够满足绝大部分应用场景的需求 。这些接口函数如下:

经验总结扩展阅读