【问题标题】:select returns "No such file or directory"选择返回“没有这样的文件或目录”
【发布时间】:2014-10-02 15:44:42
【问题描述】:

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

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

我有 retry_interval 的原因是我失去了与服务器的连接。在这种情况下,我设置了 retry_interval 并继续重试再次形成会话。

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

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

【问题讨论】:

  • 我验证了在 program_select_to_look_at_right_sockets 中我只添加了我正在监听的服务器套接字(那是 unix 域套接字——删除了代码以避免使其混乱)和我连接到的客户端套接字服务器 -- 数据到达的地方
  • 您正在无条件地打印一条错误消息,但您想知道为什么会有一条错误消息?您应该只在出现错误时打印错误消息。

标签: c sockets select tcp errno


【解决方案1】:

为什么你认为select 会返回那个错误?您需要检查select 的返回码,看看是否有错误。更多信息在这里:

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

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

【讨论】:

  • 感谢大卫帮助!添加后 if (activity
  • 太棒了!您介意通过单击左侧的复选框将我的答案标记为已接受的答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-26
  • 2014-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多