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

返回目录
listen功能
tcp服务器进入监听状态,等待tcp客户端连接请求的到达 。
原型
INT listen(SOCKET socket, USHORT backlog);
入口参数

  • family:目前仅支持IPv4地址,即AF_INET,其它地址族如AF_INET6之类的不支持
  • backlog:等待用户层接受(accept)连接请求的tcp客户端数量
返回值
0:成功-1:失败,具体的的错误信息通过onps_get_last_error()获得
示例
EN_ONPSERR enErr;……SOCKET hSockSrv = socket(AF_INET, SOCK_STREAM, 0, &enErr);if(INVALID_SOCKET != hSockSrv){if(!bind(hSockSrv, NULL, 6411)) //* 绑定成功{if(!listen(hSockSrv, usBacklog)) //* 进入监听状态{……}else //* 失败printf("%s\r\n", onps_get_last_error(hSocket, NULL)); //* 打印错误信息}else //* 绑定失败printf("%s\r\n", onps_get_last_error(hSocket, NULL)); //* 打印错误信息}elseprintf("%s\r\n", onps_error(enErr)); //*打印错误信息……返回目录
accept功能
阻塞/非阻塞型,接受一个到达的tcp连接请求 。
原型
SOCKET accept(SOCKET socket, in_addr_t *punCltIP, USHORT *pusCltPort, INT nWaitSecs, EN_ONPSERR *penErr);
入口参数
  • family:目前仅支持IPv4地址,即AF_INET,其它地址族如AF_INET6之类的不支持
  • punCltIP:指向tcp客户端Ip地址的指针
  • pusCltPort:指向tcp客户端端口的指针
  • nWaitSecs:指定等待时长,单位:秒 。0,不等待,立即返回;大于0,等待指定时间直至收到一个客户端连接请求或超时;小于0,一直等待,直至收到一个客户端连接请求或协议栈报错
  • penErr:指向错误编码的指针,函数执行失败时该参数用于接收实际的错误码
返回值
返回请求连接的tcp客户端的socket句柄;当没有新的客户端连接请求到达或协议栈报错时返回INVALID_SOCKET,具体的错误码通过penErr参数获得 。
示例
EN_ONPSERR enErr;……SOCKET hSockSrv = socket(AF_INET, SOCK_STREAM, 0, &enErr);if(INVALID_SOCKET != hSockSrv){if(!bind(hSockSrv, NULL, 6411)) //* 绑定成功{if(!listen(hSockSrv, usBacklog)) //* 进入监听状态{//* 循环等待并处理到达的tcp连接请求while(1){in_addr_t unCltIP;USHORT usCltPort;SOCKET hSockClt = accept(hSockSrv, &unCltIP, &usCltPort, 1, &enErr);if(INVALID_SOCKET != hSockClt) //* 返回了一个有效的客户端socket句柄{//* 新的客户端到达,在这里增加你的自定义代码……}else{//* 错误码为ERRNO代表无错误发生,意味着没有新的客户端连接请求到达,回到循环开始处继续等待即可if(ERRNO == enErr)continue;else //* 不等于ERRNO意味着协议栈报错,需要处理{……printf("%s\r\n", onps_error(enErr)); //* 打印错误信息}}}}else //* 失败printf("%s\r\n", onps_get_last_error(hSocket, NULL)); //* 打印错误信息}else //* 绑定失败printf("%s\r\n", onps_get_last_error(hSocket, NULL)); //* 打印错误信息}elseprintf("%s\r\n", onps_error(enErr)); //*打印错误信息……返回目录
tcpsrv_recv_poll功能
阻塞/非阻塞型,tcp服务器数据接收专用函数,等待任意一个或多个tcp客户端数据到达信号 。协议栈利用rtos提供的信号量实现了一个poll模型,当有一个及以上的tcp客户端数据到达,均会触发一个信号到用户层,我们通过tcpsrv_recv_poll()函数等待这个信号 。这个函数的第二个参数值表示这个函数最长等待多少秒,等待期间有任意一个或多个客户端数据到达则立即返回最先到达的这个客户端的socket,继续调用这个函数则继续返回下一个客户端socket,直至返回一个无效的socket才意味着当前所有已送达的数据均已读取完毕,已经没有任何客户端有新数据到达了 。
原型
SOCKET tcpsrv_recv_poll(SOCKET hSocketSrv, INT nWaitSecs, EN_ONPSERR *penErr);

经验总结扩展阅读