gpt4 book ai didi

c - 为什么select()有时连续返回0

转载 作者:可可西里 更新时间:2023-11-01 02:38:09 26 4
gpt4 key购买 nike

我在 arm linux 平台上有一个关于 select() 的问题,一方面是 arm linux 作为 tcp 客户端,另一方面是 pc 作为 tcp 服务器。 tcp 客户端连接到服务器并以固定的间隔时间从服务器接收数据,例如 5ms。大部分时候select是正常的,但是有时候会出现奇怪的情况,函数select()连续返回零(超时),之后select正常返回,但是读取数据大小异常,如下图。

有人知道这是什么原因吗?非常感谢。

enter image description here enter image description here

    while(scan->is_child_thread_active)
{
FD_ZERO(&read_fd);
w_time.tv_sec = 0;
w_time.tv_usec = (100*1000);//100ms
if (scan->tcp_socket_fd > 0)
{
FD_SET(scan->tcp_socket_fd, &read_fd);
}
else
{
break;
}
mxfd = scan->tcp_socket_fd;
if ((n_ready=select(mxfd + 1, &read_fd, (fd_set *) NULL, (fd_set *) NULL, &w_time)) < 0 )
{
print_err("select error: %s \n", strerror(errno));
close(scan->tcp_socket_fd);
scan->tcp_socket_fd = -1;
continue;
}
if (0x00 == n_ready )
{
print_err("select timeout \n");
continue;
}
scan->handleSocketRead(scan, read_fd, scan->tcp_socket_fd);
}

读取句柄编码如下

if (sock_fd > 0 && FD_ISSET(sock_fd, &read_fd_set)) 
{
if ((n_read = recv(sock_fd, scan->tcp_buffer_, TCP_BUF_SZ, 0))<=0)
{
print_err("read tcp error,fd= %d:%s\n", sock_fd, strerror(errno));
close(sock_fd);
sock_fd = -1;
return;
}
curr_data_time_ = get_ms_time_pf();
RBT_MS_T delta_time = curr_data_time_ - last_data_time_;
printf("rcv data len %d , delta time = %llu\n", n_read, delta_time);
scan->writeBufferBack(scan->tcp_buffer_, n_read);
while( scan->handleNextPacket() ) {}
last_data_time_ = get_ms_time_pf();


}

顺便说一句,在arm core freescale imx6q下运行的板子。而下图中最长的卡住时间超过1秒,其他日志显示时间有时会持续5秒甚至更长。

是不是linux配置有问题?

最佳答案

根据 the POSIX select() documentation :

RETURN VALUE

Upon successful completion, the pselect() and select() functions shall return the total number of bits set in the bit masks. Otherwise, -1 shall be returned, and errno shall be set to indicate the error.

零是一个完全合法的结果,这意味着在文件描述符上没有检测到事件。

网络流量不能保证顺利传递。如果这对您的使用有问题,您需要解决网络问题,因为代码没有问题。

关于c - 为什么select()有时连续返回0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55118783/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com