select()之后的奇怪顺序(使用FD_SET())

select()之后的奇怪顺序(使用FD_SET()),c,select,unix-socket,C,Select,Unix Socket,我正在开发一个多客户端Unix域套接字,用于通过多个进程传输数据。我发现了一些实现每个客户机和其他东西之间聊天的代码,但我希望一旦客户机向服务器发送了一些东西,服务器就会回复,客户机就会断开连接 话虽如此,但我不想在客户方面得到什么好处: int main() { int sockfd; struct sockaddr_un remote; fd_set readfds; char buf[1024]; char buf2[1024]; int l

我正在开发一个多客户端Unix域套接字,用于通过多个进程传输数据。我发现了一些实现每个客户机和其他东西之间聊天的代码,但我希望一旦客户机向服务器发送了一些东西,服务器就会回复,客户机就会断开连接

话虽如此,但我不想在客户方面得到什么好处:

int main() {
    int sockfd;
    struct sockaddr_un remote;
    fd_set readfds;
    char buf[1024];
    char buf2[1024];
    int len;

    sockfd = socket(AF_UNIX, SOCK_STREAM, 0);

    remote.sun_family = AF_UNIX;
    strcpy(remote.sun_path, SOCK_PATH);
    len = strlen(remote.sun_path) + sizeof(remote.sun_family);

    if(connect(sockfd, (struct sockaddr*)&remote, len) == -1)
        /* handle error */

    FD_ZERO(&readfds);
    FD_SET(0, &readfds);
    FD_SET(sockfd, &readfds);

    if(select(sockfd+1, &readfds, NULL, NULL, NULL) == -1)
        /* handle error */

    if(FD_ISSET(0, &readfds)) {
        fgets(buf, 1024, stdin);
        if(write(sockfd, buf, 1024) <= 0)
            /* handle error */
    }

    if(FD_ISSET(sockfd, &readfds)) {
        if(read(sockfd, &buf2, 1024) <= 0)
            /* handle error */
    }

    printf("%s\n", buf2);

    close(sockfd);
}
我有这个输出:

before select
"input to fgets"
after select
我不明白为什么我在选择之前和之后会有输入。这对我来说没有任何意义,因为我在printf之后调用fgets

我希望这是可以理解的。
我的代码怎么了?我错过了什么吗?

第一次通过时,您在服务器响应之前调用select。结果是sockfd无法准备好读取


在您的情况下,客户端可能不需要在sockfd上选择。您知道,如果您向服务器写入了要等待回复的内容,对吗?

您缺少所有变量的声明,请提供一个,并且您的许多函数调用似乎缺少参数,即writesockfd,str应该有3个参数sprintf在连接到终端时是行缓冲的。将\n添加到printfs或fflushstdout;每次之后,我都添加了你需要的所有东西,我想写一些不太可能的代码。我只是尝试添加了fflushstdout,但它并没有改变任何东西&buf2,1024那么选择的意义是什么呢?我只是尝试了一下,它在不调用select的情况下工作得非常好。但是在我看到的每个套接字示例中,在读或写之前都会调用它。SELECT或更新的轮询用于同时监视多个套接字/文件描述符。典型的情况是一个具有多个客户端连接的单线程服务器,所以它只在服务器端有用?或者如果一个客户端连接到多个服务器?是。您还可以使用它来实现读取超时。如果在设置了超时参数的情况下调用select,则可以等待预定的响应时间。
before select
"input to fgets"
after select