int _ssl_recv_timeout(int ssl_fd, char* recvdata, unsigned short recvlen, unsigned int timeout) {
int ret = -1;
int recv_readlen = 0;
int sockid;
int optLen = 4;
int rcvbuf_size = 0;
int recv_flag = 0, count_recv = 0;
unsigned int recvdlen = 0;
unsigned int uTime = _get_systick() + timeout;
unsigned int start_tick = _get_systick();
struct timeval socket_timeval = { 0 };
fd_set socket_readfd;
fd_set socket_errorfd;
sockid = fibo_ssl_sock_get_fd(ssl_fd);
printf("start_tick:%u,timeout:%u\r\n", start_tick, timeout);
if (sockid <= 0)
{
printf("error fibo_ssl_sock_get_fd =%d\r\n", sockid);
return -1;
}
int flag = lwip_fcntl(sockid, F_GETFL, 0); //不能直接覆盖原标识,先获取
lwip_fcntl(sockid, F_SETFL, flag | O_NONBLOCK) < 0);
while (1)
{
ret = sock_recv(ssl_fd, (unsigned char*)(recvdata + recvdlen), recvlen - recvdlen);
printf("sock_recv ret:%d,%d,%d\r\n", ret, recvdlen, recvlen - recvdlen);
if (ret == 0)
{
FD_ZERO(&socket_readfd);
FD_ZERO(&socket_errorfd);
FD_SET(sockid, &socket_readfd);
FD_SET(sockid, &socket_errorfd);
socket_timeval.tv_sec = 0;
socket_timeval.tv_usec = 10 * 1000;
ret = fibo_sock_lwip_select(sockid + 1, &socket_readfd, NULL, &socket_errorfd, &socket_timeval);
//printf("ssl fibo_sock_lwip_select ret:%d\r\n", ret);
if (ret < 0)
{
printf("fibo_sock_lwip_select error1:%d\r\n", ret);
break;
}
if (FD_ISSET(sockid, &socket_errorfd))
{
printf("fibo_sock_lwip_select error2:%d\r\n", ret);
break;
}
else if (FD_ISSET(sockid, &socket_readfd))
{
continue;
}
}
else if (ret < 0) {
printf("sock_recv finish ret:%d,recvlen:%d,timeout:%d,real recv len:%d,consume tick:%d\r\n",
ret, recvlen, timeout, recvdlen, _get_systick() - start_tick);
return recvdlen > 0 ? recvdlen : -1;
}
else
{
recvdlen += ret;
if (recvdlen >= recvlen)
{
printf("sock_recv finish recvlen:%d,timeout:%d,real recv len:%d,consume tick:%d\r\n",
recvlen, timeout, recvdlen, _get_systick() - start_tick);
return recvdlen;
}
}
if (_get_systick() > uTime)
{
printf("recv timeout finish recvlen:%d,timeout:%d,real recv len:%d,consume tick:%d\r\n",
recvlen, timeout, recvdlen, _get_systick() - start_tick);
return recvdlen;
}
_sys_msleep(50);
}
return recvdlen;
}