C select总是检测到可读的套接字

时间:2015-10-21 21:57:46

标签: c sockets select

我找了一个非常相似的主题的回答,但我找不到一个好的答案(我认为)。

首先是我的代码:

fd_set readset;
int result;

while(1) {
    FD_ZERO(&readset);
    FD_SET(sock_client, &readset);
    FD_SET(fileno(stdin), &readset);
    result = select(sock_client + 1, &readset, NULL, NULL, NULL);

    if (result > 0) {
        if (FD_ISSET(sock_client, &readset)) {
            memset(buffer, 0, sizeof(buffer));
             read(server_socket, buffer, 5000);
            printf("%s", buffer);
        } 

        if (FD_ISSET(fileno(stdin), &readset)) {
            memset(msg, 0, sizeof(msg));
            read(fileno(stdin), msg, 5000);
            printf("%s", msg);
        }
    }
}

编辑(更正了读取()中的错误):

// socket client
sock_client = do_socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// socket server
server_socket = do_socket(AF_INET, SOCK_STREAM, 0);

// server connexion
do_connect(server_socket, 
    (struct sockaddr *) & addr_sock_host, sizeof(addr_sock_host));

fd_set readset;
int result;

while(1) {
    FD_ZERO(&readset);
    FD_SET(sock_client, &readset);
    FD_SET(fileno(stdin), &readset);
    result = select(sock_client + 1, &readset, NULL, NULL, NULL);

    if (result > 0) {
        if (FD_ISSET(sock_client, &readset)) {
            memset(buffer, 0, sizeof(buffer));
            int size = read(sock_client, buffer, 5000);
            printf("size : %i\n", size);
        } 

        if (FD_ISSET(fileno(stdin), &readset)) {
            memset(msg, 0, sizeof(msg));
            read(fileno(stdin), msg, 5000);
            printf("%s", msg);
        }
    }
}

当我运行它时:

size : -1
size : -1
size : -1
size : -1
size : -1
size : -1
size : -1
size : -1

......无限

END OF EDIT

实际上,select总是返回1,因为sock_client总是在readset中,而没有什么可读的。更多,我的FD_SET处于无限循环中。这就是为什么我不明白为什么sock_client被检测为可读(总是)?

我希望你能理解我的问题,如果已经提出问题我会道歉。

由于

1 个答案:

答案 0 :(得分:2)

你不需要memset(),,你无法说服我从侦听套接字块中读取。这里真正的问题是你:

  • 从错误的插座FD读取,
  • 完全忽略read()返回的值。

你需要:

  1. 将其存储在一个值中。
  2. 将其与-1进行比较,如果是,请立即致电perror()或其中一位朋友,然后关闭套接字。
  3. 否则,将其与零进行比较,如果是,则将套接字与它进行比较。
  4. 否则,使用必须保留的正值作为传入数据的长度?这就是您不需要memset()
  5. 的原因