c语言之socket实现非阻塞接收数据代码示例


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;
}

posted @ 2025-08-15 14:35  我不是萧海哇~~~  阅读(17)  评论(0)    收藏  举报