客户端C中stdin和socket的复用

客户端C中stdin和socket的复用,c,sockets,unix,client-server,multiplexing,C,Sockets,Unix,Client Server,Multiplexing,我编写了一个简单的TCP服务器来服务于许多客户机,它与telnet配合使用非常出色。但是,我还想编写我自己的简单TCP客户机,使用多路复用套接字和标准输入。和我平时写的服务器连接一样,连接代码还可以 我对多路复用套接字和标准输入有问题。我的代码造成了最大的问题: void multiplexClient(FILE *fp, int sockfd, char inbuffer[], char outbuffer[]) { int maxfd; fd_

我编写了一个简单的TCP服务器来服务于许多客户机,它与telnet配合使用非常出色。但是,我还想编写我自己的简单TCP客户机,使用多路复用套接字和标准输入。和我平时写的服务器连接一样,连接代码还可以

我对多路复用套接字和标准输入有问题。我的代码造成了最大的问题:

    void multiplexClient(FILE *fp, int sockfd, char inbuffer[], char outbuffer[])
    {
        int maxfd;
        fd_set rset;

        FD_ZERO(&rset);
        for(;;)
        {
            FD_SET(fileno(fp), &rset);
            FD_SET(sockfd, &rset);
            maxfd = std::max(fileno(fp), sockfd) + 1;

            int res = select(maxfd, &rset, NULL, NULL, NULL);

            if(res < 0)
            {
                printf("'select error\n");
            }

            if(FD_ISSET(sockfd, &rset))
            {
                if(read(sockfd, inbuffer, sizeof(inbuffer)) == 0)
                   printf("read error\n");
                printf("Received: %s\n", inbuffer);
                fflush(stdout);
                 memset(inbuffer, 0, sizeof(inbuffer));
            }

            else if(FD_ISSET(fileno(fp), &rset))
            {
                fprintf(stdout, "\n> ");
                if(fgets(outbuffer, sizeof(outbuffer), fp) == NULL)
                    return;
                write(sockfd, outbuffer, strlen(outbuffer));
                printf("Send: %s\n", outbuffer);
                fflush(stdout);
                 memset(outbuffer, 0, sizeof(outbuffer));
            }
        }
    }

// int main
// sockfd = socket...
// connect

while(1)
{
 multiplexClient(stdin, socket_fd, inbuffer, outbuffer);
}

// ...
    return 0;
}
我的第二个客户:

$ ./client localhost 9034
hello! :)

> Send: hel
whats is wrong with this chat?!

> Send: lo!

> Send:  :)

> Send: 


> Send: wha
如何修复此问题?

在将文件选择器重新添加到集合之前,您缺少一个FD_零

< P>也,这是C++,因为它使用了STD::Max。

< P>在重新添加文件选择器到集合之前,您丢失了FDY0。


< P>也,这是C++,因为它使用了STD::max ./p>< p>你的问题在这里稍微解释:

read(sockfd, inbuffer, sizeof(inbuffer));
printf("Received: %s\n", inbuffer);
read调用返回您忽略的写入字节数,并且缓冲区不是C字符串,也就是说,它不是以null结尾的

你应该有以下几点:

quant = read (sockfd, inbuffer, sizeof(inbuffer));
printf ("Received: %*.*s\n", quant, quant, inbuffer);

你的问题在这里稍作解释:

read(sockfd, inbuffer, sizeof(inbuffer));
printf("Received: %s\n", inbuffer);
read调用返回您忽略的写入字节数,并且缓冲区不是C字符串,也就是说,它不是以null结尾的

你应该有以下几点:

quant = read (sockfd, inbuffer, sizeof(inbuffer));
printf ("Received: %*.*s\n", quant, quant, inbuffer);

补充,看我的新帖子-它没有帮助。补充,看我的新帖子-它也没有帮助