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

返回目录
close功能
关闭socket,释放占用的协议栈资源 。
原型
void close(SOCKET socket);
入口参数

  • socket:要关闭的socket句柄
返回值

示例
EN_ONPSERR enErr;SOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0, &enErr);……if(INVALID_SOCKET != hSocket)close(hSocket);返回目录
connect功能
用于tcp类型的socket时 , 其功能为与目标服务器建立tcp连接,阻塞型;用于udp类型的socket时,其功能为绑定一个固定的目标通讯地址,udp通讯均与这个固定地址进行 。
原型
INT connect(SOCKET socket, const CHAR *srv_ip, USHORT srv_port, INT nConnTimeout);
入口参数
  • socket:要进行connect操作的socket句柄
  • srv_ip:目标服务器地址
  • srv_port:目标服务器端口
  • nConnTimeout:仅用于tcp通讯,指定连接超时时间(单位:秒),参数值如小于等于0则协议栈会采用缺省值,该值由TCP_CONN_TIMEOUT宏指定(参见sys_config.h);udp通讯未使用这个参数,可以指定任意一个值
返回值
0:连接成功
-1:连接失败,具体的错误信息通过onps_get_last_error()获得
示例
EN_ONPSERR enErr;SOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0, &enErr);if(INVALID_SOCKET == hSocket){printf("%s\r\n", onps_error(enErr));return;}if(!connect(hSocket, "47.92.239.107", 6410, 10)){//* 连接成功 , 在这里添加你的自定义代码……}else{//* 连接失败 , 打印错误信息printf("%s\r\n", onps_get_last_error(hSocket, NULL));}……close(hSocket);返回目录
connect_nb功能
仅用于tcp类型的socket,非阻塞型,与目标tcp服务器建立连接 。
原型
INT connect_nb(SOCKET socket, const CHAR *srv_ip, USHORT srv_port);
入口参数
  • socket:要进行connect操作的socket句柄
  • srv_ip:目标服务器地址
  • srv_port:目标服务器端口
返回值
0:连接成功 1:连接中-1:连接失败,具体的错误信息通过onps_get_last_error()获得
示例
EN_ONPSERR enErr;SOCKET hSocket = socket(AF_INET, SOCK_STREAM, 0, &enErr);if(INVALID_SOCKET == hSocket){printf("%s\r\n", onps_error(enErr));return;}//* 循环等待tcp连接成功while(1){INT nRtnVal = connect_nb(hSocket, "47.92.239.107", 6410);if(!nRtnVal){//* 连接成功 , 在这里增加你的自定义代码……break; //* 退出循环 , 不再轮询检查tcp连接进程}else if(nRtnVal < 0){//* 连接失败 , 打印错误信息并退出循环不再轮询检查tcp连接进程printf("%s\r\n", onps_get_last_error(hSocket, NULL));break;}else;//* 连接中 , tcp三次握手操作尚未完成,此时你可以干点别的事情 , 或者延时一小段时间后继续检查当前连接状态……os_sleep_secs(1);}……close(hSocket);返回目录
is_tcp_connected功能
检查tcp链路是否处于连接状态 。
原型
INT is_tcp_connected(SOCKET socket, EN_ONPSERR *penErr);
入口参数
  • socket:socket句柄
  • penErr:指向错误编码的指针,函数执行失败时该参数用于接收实际的错误码
返回值
0:未连接 1:已连接-1:函数执行失败,具体的错误信息通过参数penErr获得
示例
EN_ONPSERR enErr;……INT nRtnVal = is_tcp_connected(hSocket, &enErr);if(nRtnVal > 0)printf("已连接\r\n");else if(!nRtnVal)printf("未连接\r\n");elseprintf("检查失败,%s\r\n", onps_error(enErr));……返回目录
send功能
发送数据到目标地址 。注意tcp链路下为阻塞型,直至收到对端的tcp层ack报文或超时才会返回 。udp链路下为非阻塞型,且只有在调用connect()函数后才能使用这个函数 。
原型
INT send(SOCKET socket, UCHAR *pubData, INT nDataLen, INT nWaitAckTimeout);
入口参数
  • socket:socket句柄
  • pubData:指向要发送的数据的指针
  • nDataLen:要发送的数据的长度,单位:字节
  • nWaitAckTimeout:仅用于tcp链路,指定发送超时时间,单位:秒,如参数值不大于0 , 则协议栈采用系统缺省值 , 该值由TCP_ACK_TIMEOUT宏指定(参见sys_config.h);udp链路未使用 , 可指定任意值
返回值
发送成功,则返回值等于nDataLen;发送失败 , 返回值不等于nDataLen,具体的错误信息通过onps_get_last_error()获得 。
示例
/* tcp链路下send()函数使用示例 */EN_ONPSERR enErr;……UCHAR ubUserData[128];INT nSndBytes, nSndNum = 0; __lblSend:if(nSndNum > 2){//* 超出重传次数,不再重传,可以关闭当前tcp链路重连tcp服务器或者你自己的其它处理方式……return;}nSndBytes = send(hSocket, ubUserData, sizeof(ubUserData), 3);if(sizeof(ubUserData) == nSndBytes){//* 发送成功,在这里添加你自己的处理代码……}else{const CHAR *pszErr = onps_get_last_error(hSocket, &enErr);if(enErr == ERRTCPACKTIMEOUT) //* 等待tcp层的ack报文超时{//* 数据重传,用户层实现tcp层重传机制nSndNum++;goto __lblSend;}else //* 其它错误,意味着底层协议栈捕捉到了内存不够用、网卡故障等类似的严重问题{//* 没必要触发重传机制了,根据你自己的具体情形增加容错处理代码并打印错误信息……printf("发送失败,%s\r\n", pszErr);}}……

推荐阅读