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

返回目录
send_nb功能
发送数据到目标地址,非阻塞型,其它与send函数完全相同 。
原型
INT send_nb(SOCKET socket, UCHAR *pubData, INT nDataLen);
入口参数

  • socket:socket句柄
  • pubData:指向要发送的数据的指针
  • nDataLen:要发送的数据的长度,单位:字节
返回值
发送成功 , 则返回值等于nDataLen;返回值为0,上一组数正处于发送中(尚未收到对端的tcp ack报文),需要等待其发送成功后再发送当前数据;发送失败,返回值小于等于0,具体的错误信息通过onps_get_last_error()获得 。
示例
/* tcp链路下send_nb()函数使用示例 */EN_ONPSERR enErr;……UCHAR ubUserData[128];INT nRtnVal;__lblSend:nRtnVal = send_nb(hSocket, ubUserData, sizeof(ubUserData));if(sizeof(ubUserData) == nRtnVal){//* 调用is_tcp_send_ok()函数等待是否已成功送达对端,或者(同时)做点别的事情……}else if(0 == nRtnVal){//* 上一组数据尚未发送完毕,需要等待发送完毕后再发送当前数据,等待期间你可以在这里做点别的事情……goto __lblSend;}else{//* 发送失败,协议栈底层捕捉到了一个严重的系统错误,这里增加你的容错代码并打印错误信息,不再继续发送……printf("发送失败,%s\r\n", onps_get_last_error(hSocket, NULL));}……返回目录
is_tcp_send_ok功能
非阻塞型,数据是否已成功送达tcp链路的对端(已收到对端回馈的tcp ack报文) 。
原型
INT is_tcp_send_ok(SOCKET socket);
入口参数
  • socket:socket句柄
返回值
0:发送中 1:发送成功-1:发送失败,具体错误信息通过onps_get_last_error()函数获得
示例
EN_ONPSERR enErr;……UCHAR ubUserData[128];INT nRtnVal;__lblSend:nRtnVal = send_nb(hSocket, ubUserData, sizeof(ubUserData));if(sizeof(ubUserData) == nRtnVal){//* 数据已通过网卡成功送出,接下来轮询等待对端回馈的tcp ack报文,确保数据成功送达对端while(1){INT nResult = is_tcp_send_ok(hSocket);if(nResult == 1){//* 发送成功了 , 退出轮询等待break;}else if(nResult < 0){//* 协议栈底层捕捉到了一个严重的系统错误,不再轮询等待,并打印错误信息……printf("%s\r\n", onps_get_last_error(hSocket, NULL));break;}//* 发送中,在这里你可以做点别的事情……}……}else if(0 == nRtnVal){//* 上一组数据尚未发送完毕,需要等待发送完毕后再发送当前数据 , 等待期间你可以在这里做点别的事情……goto __lblSend;}else{//* 发送失败,协议栈底层捕捉到了一个严重的系统错误,这里打印错误信息,不再继续发送printf("发送失败,%s\r\n", onps_get_last_error(hSocket, NULL));}……返回目录
sendto功能
非阻塞型,仅用于udp通讯,发送数据到指定的目标地址 。
原型
INT sendto(SOCKET socket, const CHAR *dest_ip, USHORT dest_port, UCHAR *pubData, INT nDataLen);
入口参数
  • socket:socket句柄
  • dest_ip:目标地址
  • dest_port:目标端口
  • pubData:指向要发送的数据的指针
  • nDataLen:要发送的数据的长度,单位:字节
返回值
发送成功,返回值等于nDataLen,反之则发送失败,具体的错误信息通过onps_get_last_error()获得 。
示例
EN_ONPSERR enErr;……UCHAR ubUserData[128];INT nSndBytes = sendto(hSocket, "47.92.239.107", 6411, ubUserData, sizeof(ubUserData));if(sizeof(ubUserData) == nSndBytes){//* 发送成功,在这里增加你自己的业务代码……}else{//* 发送失败,在这里增加你自己的容错代码并打印错误信息……printf("发送失败,%s\r\n", onps_get_last_error(hSocket, NULL));}……返回目录
recv功能
读取链路对端发送的数据 。其阻塞类型取决于socket_set_rcv_timeout()函数设定的接收等待时长 。缺省为阻塞型,一直等待直至收到数据或报错 。
原型
INT recv(SOCKET socket, UCHAR *pubDataBuf, INT nDataBufSize);
入口参数
  • socket:socket句柄
  • pubDataBuf:指向数据接收缓冲区的指针
  • nDataBufSize:数据接收缓冲区的大小,单位:字节
返回值
大于等于0为实际到达的数据长度,单位:字节;小于0 , 接收失败,具体的的错误信息通过onps_get_last_error()获得 。
示例
EN_ONPSERR enErr;……UCHAR ubRcvBuf[1500];INT nRcvBytes = recv(hSocket, ubRcvBuf, sizeof(ubRcvBuf));if(nRcvBytes > 0) //* 收到数据{……}else{if(nRcvBytes < 0) //* 协议栈底层捕捉到了一个严重错误,在这里增加你的容错代码并打印错误信息{……printf("%s\r\n", onps_get_last_error(hSocket, NULL));}}……返回目录

推荐阅读