1

C では、受信したすべてのメッセージの内容を出力するようにサーバーに要求します。すべてのメッセージは、「メッセージ: /counter/」の形式に従います。

while (1){
            length = sizeof(struct sockaddr);
    /*      receive from client */
            lenstr = recv(newfd, buff, 20000, 0);
            if (lenstr == -1){
                perror("recv(): ");
                exit(1);
            }
            buff[lenstr] = '\0';
            printf("Received: %s \n", buff);
    /*        send back to client*/
            if (send(newfd, buff, lenstr, 0) < 0){
                perror("send(): ");
                exit(-1);
            }

サーバーを実行すると、新しい行に移動せずにメッセージが次々と表示されます。ここで何が欠けていますか?(接続はここでは TCP です) ありがとうございます。

4

2 に答える 2

2

ソケットから受け取るデータには、ゼロまたは制御文字が含まれる場合があります。これらは印刷しないでください。

次の関数を使用して、受信したデータを にダンプしてみてくださいstdout。すべての印刷不可能な文字をドットに置き換えます。

void dump_buf(char const* buf, size_t buf_len) {
    char const* buf_end = buf + buf_len;
    while(buf != buf_end) {
        char c = *buf++;
        putchar(isprint(c) ? c : '.');
    }
    putchar('\n');
}

// ...

lenstr = recv(newfd, buff, 20000, 0);
if (lenstr == -1) {
    perror("recv(): ");
    exit(1);
}
dump_buf(buff, lenstr);
于 2013-02-08T18:47:37.497 に答える
0

TCP には「メッセージ」がなく、双方向の連続したバイト ストリームを処理します。その時点までに受信したデータと 2000 の間のデータのうち、少ないものを読み取っているだけです。おそらく、本当にStream Control Transmission Protocolが必要ですか? または、メッセージの末尾に何らかの方法で (おそらく '\n' で) マークを付けて、1 文字ずつ読みますか? それとも、単一のメッセージの長さを読み取るだけですか (固定長の場合)?

于 2013-02-08T18:34:25.587 に答える