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


socket_set_rcv_timeout功能
设定recv()函数接收等待的时长 。其设定的接收等待时长决定了recv()函数的阻塞类型 。等于0:非阻塞,recv()不等待立即返回大于0:阻塞 , recv()等待指定时长直至数据到达或超时小于0:阻塞,recv()一直等待直至数据到达或出错
原型
BOOL socket_set_rcv_timeout(SOCKET socket, CHAR bRcvTimeout, EN_ONPSERR *penErr);
入口参数

  • family:目前仅支持IPv4地址,即AF_INET,其它地址族如AF_INET6之类的不支持
  • bRcvTimeout:recv()函数的接收等待时长,单位:秒
  • penErr:指向错误编码的指针 , 当socket()函数执行失败,该参数用于接收实际的错误码
返回值
设置成功返回TRUE,否则返回FALSE,具体的错误信息通过参数penErr获得 。
示例
EN_ONPSERR enErr;……if(!socket_set_rcv_timeout(hSocket, 1, &enErr)){//* 设置失败,打印错误信息 , 此时系统采用缺省值,即recv()函数一直等待直至收到数据或协议栈报错printf("%s\r\n", onps_error(enErr));}……返回目录
recvfrom功能
接收数据并返回数据源的地址信息,仅用于udp通讯 。
原型
INT recvfrom(SOCKET socket, UCHAR *pubDataBuf, INT nDataBufSize, in_addr_t *punFromIP, USHORT *pusFromPort);
入口参数
  • family:目前仅支持IPv4地址,即AF_INET,其它地址族如AF_INET6之类的不支持
  • pubDataBuf:指向数据接收缓冲区的指针
  • nDataBufSize:数据接收缓冲区的大?。ノ唬鹤纸?/li>
  • punFromIP:指向数据源ip地址的指针
  • pusFromPort:指向数据源端口的指针
返回值
实际收到的数据的长度,单位:字节;小于0则接收失败,具体的的错误信息通过onps_get_last_error()获得 。
示例
EN_ONPSERR enErr;……UCHAR ubRcvBuf[512];in_addr_t unFromIp;USHORT usFromPort;INT nRcvBytes = recvfrom(hSocket, ubRcvBuf, sizeof(ubRcvBuf), &unFromIp, &usFromPort);if(nRcvBytes > 0) //* 收到数据{CHAR szAddr[20];printf("收到来自地址%s:%d的%d字节的数据\r\n", inet_ntoa_safe_ext(unFromIp, szAddr), usFromPort, nRcvBytes);……}else{if(nRcvBytes < 0) //* 协议栈底层捕捉到了一个严重错误,在这里增加你的容错代码并打印错误信息{……printf("发送失败,%s\r\n", onps_get_last_error(hSocket, NULL));}}……返回目录
bind功能
绑定一个ip地址和端口 。
原型
INT bind(SOCKET socket, const CHAR *pszNetifIp, USHORT usPort);
入口参数
  • family:目前仅支持IPv4地址,即AF_INET,其它地址族如AF_INET6之类的不支持
  • pszNetifIp:指向要绑定的ip地址的指针,为NULL绑定任意网络接口
  • usPort: 要绑定的端口
返回值
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)) //* 绑定成功……else //* 绑定失败printf("%s\r\n", onps_get_last_error(hSocket, NULL)); //* 打印错误信息}elseprintf("%s\r\n", onps_error(enErr)); //*打印错误信息……返回目录
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);
入口参数