c - 选择返回 "No such file or directory"

标签 c sockets select tcp errno

我已经实现了一个与另一台服务器通信的客户端。两者都使用 TCP/IP 套接字交换消息。

我注意到,每次服务器向我发送一条消息时,我都会在选择调用中收到以下错误“没有这样的文件或目录”。奇怪的是,设置了正确的位,并且我能够从服务器读取消息,但看到这个错误很烦人。

我设置 retry_interval 的原因是为了防止我失去与服务器的连接。在这种情况下,我设置了 retry_interval 并不断重试再次形成 session 。

我看到此错误消息的客户端的相关代码:

for (;;)
{
    program_select_to_look_at_right_sockets(&readfds, &maxfds);

    do 
    {
        if (RETRY_TIMER_IS_SET(retry_interval))
        {
            activity = select( maxfds + 1 , &readfds , NULL , NULL , &retry_interval);
            set_retry_timer (&retry_interval);
        }
        else                
            activity = select( maxfds + 1 , &readfds , NULL , NULL , NULL);

        perror("main loop select error"); <-- Whenever i get a message from server this select throws an error

    } while (activity < 0 && errno == EINTR);

    if (RETRY_TIMER_IS_SET(retry_interval))
    {
        printf ("Connect RETRY timer to server expired!\n");
        connect_to_server_again();
    }
    else if (FD_ISSET (server_connection_socket, &readfds))
    { 
        /* Even if an error is thrown the code does reach this point which i find somewhat strange */
        printf ("Server sent us a message!\n");
        bytes_read = process_data_from_server();

        if (bytes_read == 0)
        {
            clean_connection_from_server (&readfds);
            set_retry_timer (&retry_interval);
        }
    }

最佳答案

您认为为什么 select 返回该错误?您需要检查 select 的返回代码以查看是否存在错误。更多信息在这里:

http://man7.org/linux/man-pages/man2/select.2.html

如果您不检查返回代码,那么您不知道是否存在错误,并且 perror 打印的错误可能是先前函数调用中的一些随机事件。

关于c - 选择返回 "No such file or directory",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25215740/

相关文章:

无法在mac上执行C代码(最初在DevC++中执行)

c# - 在发送数据之前检查套接字是否已连接

WHERE to select from db 之后Mysql有更多项目

c - 将 2d 字符数组附加到 1d 字符数组(在 C 中)

c - gcc 链接器错误 : version node not found for symbol

javascript - 处理 GET 字符限制

javascript - 预加载器不会忽略 websocket - pace js

mysql - 如何在这两个表上创建 select 语句

带有选择查询的postgresql多重插入

C结构字符串读取错误