1

私は多くのクライアントにサービスを提供するために単純なTCPサーバーを作成しました(それはtelnetでうまく機能します)。しかし、多重化ソケットとstdin入力を備えた独自の単純なTCPクライアントも作成したかったのです。いつものように書いたサーバーとの接続、接続コードはOKです。

ソケットとstdin入力の多重化に問題があります。最大の問題を引き起こす私のコード:

    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, other client!

> Send: hel
Received: hel
Received: lo! ��~�~���~�
Received: :)

Received: wha

私の2番目のクライアント:

$ ./client localhost 9034
hello! :)

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

> Send: lo!

> Send:  :)

> Send: 


> Send: wha

これを修正する方法は?

4

2 に答える 2

3

あなたの問題はここにあります(少し言い換えます):

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);
于 2012-12-14T12:13:07.253 に答える
1

FD_ZERO()ファイルセレクターをセットに再度追加する前に、が欠落しています。

また、これはを使用するため、C++std::max()です。

于 2012-12-14T12:09:23.177 に答える