0

我编写了一个 ping 程序,将 syn 数据包发送到目标 IP 地址 1.1.1.1 端口 0。我使用了 wireshark,我看到返回的数据包带有 RST/ACK 标志。但问题是当我使用 select() 尝试读取套接字时, select()总是返回 0。所以我不知道如何调试程序。我确定我每次都重置 fd_set 读取集。有什么我错过的吗?我发现使用wireshark在0.0003秒内返回来自1.1.1.1的回复我设置的超时是1秒(1000毫秒) 这是代码

void readloop() {
    ....
    while(nsent < 4) {
        send_v4();
        wait_for_reply(1000);    // wait for 1 second;
    }
}

int wait_for_reply(long wait_time) {
....
    result = recving_time(...);
    if(result < 0)  // because time out
        return 0;
....
}

int recving_time(...) {
......
    fd_set readset;
select_again:
    set timeout value to structure *to*

    FD_ZERO(&readset);
    FD_SET(sockfd, &readset);
    readable = select(sockfd+1, &readset, NULL, NULL, &to);
#ifdef DEBUG
    fprintf(stderr, "readable is %d\n",readable); // **Why readable always be 0 although packets returned.** 
#endif
    if(readable < 0) {
        if(errno == EINTR)
            goto select_again;
    else {
        perror("select() error");
        exit(1);
    }   

    if(readable == 0)  {
        return -1;
    }
    ......
}

我不确定这里有足够的代码来理解我想说的话。如果你能帮助我,我将非常感激

4

1 回答 1

0

Select() 返回描述符集中包含的就绪描述符的数量,如果发生错误,则返回 -1。 如果时间限制到期,则 select() 返回 0。

看起来您的超时(您没有显示设置)正在过去。

于 2013-04-28T13:24:49.253 回答