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


示例
参见上一篇博文《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接口函数有十几个,能够满足绝大部分应用场景的需求 。这些接口函数如下:
  • socket:创建一个socket,目前仅支持udp和tcp两种类型
  • close:关闭一个socket,释放当前占用的协议栈资源
  • connect:与目标tcp服务器建立连接(阻塞型)或绑定一个固定的udp服务器地址
  • connect_nb:与目标tcp服务器建立连接(非阻塞型)
  • is_tcp_connected:获取当前tcp链路的连接状态
  • send:数据发送函数,tcp链路下为阻塞型
  • send_nb:数据发送函数 , 非阻塞型
  • is_tcp_send_ok:数据是否已成功送达tcp链路的对端(收到tcp ack报文)
  • sendto:udp数据发送函数,发送数据到指定目标地址
  • recv:数据接收函数,udp/tcp链路通用
  • recvfrom:数据接收函数 , 用于udp链路,接收数据的同时函数会返回数据源的地址信息
  • socket_set_rcv_timeout:设定recv()函数接收等待的时长,单位:秒
  • bind:绑定一个固定端口、地址
  • listen:tcp服务器进入监听状态
  • accept:接受一个到达的tcp连接请求
  • tcpsrv_recv_poll:tcp服务器专用函数,等待任意一个或多个tcp客户端数据到达信号
  • socket_get_last_error:获取socket最近一次发生的错误信息
  • socket_get_last_error_code:获取socket最近一次发生的错误编码
socket功能
创建一个socket , 支持udp和tcp两种类型,即:SOCK_DGRAM和SOCK_STREAM 。注意,不使用时一定要调用close()函数关闭,以释放其占用的协议栈相关资源 。
原型
SOCKET socket(INT family, INT type, INT protocol, EN_ONPSERR *penErr);
入口参数
  • family:目前仅支持IPv4地址,即AF_INET , 其它地址族如AF_INET6之类的不支持
  • type:指定socket类型,支持SOCK_STREAM和SOCK_DGRAM两种类型,前者为tcp,后者为udp
  • protocol:未使用 , 固定为0
  • penErr:指向错误编码的指针,当socket()函数执行失败,该参数用于接收实际的错误码
返回值
执行成功返回socket句柄,失败返回INVALID_SOCKET , 具体的错误信息参见penErr参数返回的错误码 。
示例
EN_ONPSERR enErr;//* tcpSOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0, &enErr);if(INVALID_SOCKET == hSocket) //* 返回一个无效的socketprintf("%s\r\n", onps_error(enErr)); //*打印错误信息//* udpSOCKET hSocket = socket(AF_INET, SOCK_DGRAM, 0, &enErr);……

推荐阅读