4

サーバーからデータを受信しようとしていますが、初めて正常に動作しますが、read() がループし続けると、以前に読み取った古い値も格納されます。これが私がこれまでに持っているものです。

        char receive[50];

        if((he = gethostbyname(servername)) == NULL ) {

            perror(strcat("Cannot find server named:", servername));
            exit(0);
        }

        he = gethostbyname("localhost");
        localIP = inet_ntoa(*(struct in_addr *)*he->h_addr_list);
        client_sock_desc = socket(AF_INET, SOCK_STREAM, 0);
        server_addr.sin_family = AF_INET;
        server_addr.sin_addr.s_addr = inet_addr(localIP);
        server_addr.sin_port = htons(serverport);
        len = sizeof(server_addr);
        if(connect(client_sock_desc, (struct sockaddr *)&server_addr,len) == -1) {
            perror("Client failed to connect");
            exit(0);
        }

        strcpy(buf, "CLIENT/REQUEST\n");
        send(client_sock_desc, buf, strlen(buf), 0);
        //send actual function request

        //put a space before \n char to make it easier for the server
        for(i = 0; i < sizeof(wholeRequest); i++) {
            if(wholeRequest[i] == '\n') {
                wholeRequest[i] = ' ';
                wholeRequest[i+1] = '\n';
                break;
            }
        }

        while(read(client_sock_desc, receive, sizeof(receive)) > 0) {
            strcpy(receive, ""); //attempt to erase all old values
            printf(receive);
            fflush(stdout);
        }
        close(client_sock_desc);

サーバーがデータを一度送信してソケットを閉じると、完全に機能します。しかし、クライアントにソケットを再度開いてもらい、サーバーにデータを送信すると、サーバーは再びクライアントにデータを送信してソケットを閉じます。クライアントはサーバーが送信したデータを再度読み取ろうとしますが、今回は新しい情報と古い情報の一部の両方で受信を埋めます

4

1 に答える 1

5

あなたのコードでは、受信したデータを印刷する前に削除しているように思えます-次に、printf基本的に空の文字列を渡しますが、それがどうなるかわかりませんprintf(空のフォーマット文字列であるため)。

これを試して:

int nread;
while((nread = read(client_sock_desc, receive, sizeof(receive)-1)) > 0) {
        receive[nread]='\0';    // explicit null termination: updated based on comments
        printf("%s\n",receive); // print the current receive buffer with a newline
        fflush(stdout);         // make sure everything makes it to the output
        receive[0]='\0';        // clear the buffer : I am 99% sure this is not needed now
    }
于 2013-04-21T21:38:13.907 に答える