質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • C

    4524questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • ネットワーク

    642questions

    ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。

ソケットでprintfがうまくいきません。

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 845

strike1217

score 568

while(1){
        sin_size = sizeof(struct sockaddr_in);
        new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
        if(new_sockfd == -1)
            printf("Error Connection\n");

        printf("PORT of Server : %d, Connection from client : %s\n", ntohs(client_addr.sin_port),inet_ntoa(client_addr.sin_addr));
        send(new_sockfd, fer, strlen(fer), 0);
        recv_length = recv(new_sockfd, &buffer, 1024, 0) - 2;
        while(recv_length > 0){
            printf("Recieved : %d Byte packet\n", recv_length - 2);
            printf(">>>");
            for(i = 0; i <= recv_length - 2; i++){
                if(!isspace(buffer[i]))
                    printf("%c", buffer[i]);
            }
            printf("\n");

            for(i = 0; i<= 1024; i++)
                buffer[i] = ' ';
            recv_length = recv(new_sockfd, &buffer, 1024, 0);
        }


上記のような普通のソケットプログラムを作ってみました。
省略しています。

最初は
printf("Recieved : %d Byte packet\n", recv_length - 2);
printf(">>>");
printf("%s\n", buffer);

とやっていたのですが、これではうまく表示されなかったので、
スペースで埋めて、文字列をクリアしてみたのです。
が・・・
これでは、クライアント側から you will make me happyと送信すると、
.>>> youwillmakemehappy
となってしまいます。

どうしたら、よいでしょうか??
クライアントから送信された文字列を「普通に」サーバー側に表示させたいのです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

詳しく見てませんが、これがいらないのでは?

if(!isspace(buffer[i]))

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/27 09:24

    できました!!
    以前、strlen()でやっていたので、if(!isspace(buffer[i]))がないと残りのスペースがたくさん表示されていたので、プログラムに入ってしまっていたようです。
    ありがとうございます

    キャンセル

+1

ttyp03さんの回答に加えてコメントします。

whileの直前の行では受信長-2を変数に入れてます。多分最後のCR,LFの2文字を除く長さにしたかったのだと推測しますが、whileループ中のfor文でさらにrecv_length-2の範囲しか表示対象にしていませんので論理が矛盾している気がします。

蛇足:

これではうまく表示されなかったので

質問など他者とプログラムの動作についてやりとりする際「うまく表示されなかった」ではなく「こう表示された」と明記することがコツです。そのほうが「何が問題か」閲覧者に明確にわかるので早く結論に到達できることが多い思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/27 09:36

    あ!
    ありがとうございます。

    キャンセル

0

受信バッファbufferの型って何でしょう?recv_length = recv(new_sockfd, &buffer, 1024, 0) - 2;recv_length = recv(new_sockfd, &buffer, 1024, 0);

型がchar *とかchar buffer[...]なら&は不要です。&を付けてるのでメモリを壊してます。
コンパイラ何使用されているのか(またはコンパイルオプションに何を指定しているのか)わかりませんが、コンパイルするとwarning出ませんか?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/27 09:22

    char buffer[1024];
    にして宣言しています。
    &なしでもやってみました。
    結果は変わらなかったです。
    &つけても、つけなくてもいいんですね!始めて知りました。
    ありがとうございます

    キャンセル

  • 2016/12/27 11:42

    いいえ、ご質問記載の場合は&を付けてはいけません

    キャンセル

0

>これではうまく表示されなかったので、
どのように表示されたのでしょうか?

>これでは、クライアント側から you will make me happyと送信すると、 
>youwillmakemehappy 
>となってしまいます。
if(!isspace(buffer[i]))
にて空白類のもの以外をprintfで表示させているので、結果は当然ですね

あとwhile文でひたすら回していますので、上記処理の場合、ひたすら文字列が送られてこないと
すぐに while(recv_length > 0)
は抜けてしまいそうです。
その上にwhile(1)で囲まれているので、if(recv_length > 0)で良さそうで、
投稿コードの最後のrecvは無くてもいいように見える

送信されたものを全て受けたいならば、区切り文字または終端の判定が必要です

あとはY.Hさんの指摘事項かしら

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/27 09:25

    ありがとうございます。
    最後のrecv()は取って再度やってみたいと思います

    キャンセル

同じタグがついた質問を見る

  • C

    4524questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • ネットワーク

    642questions

    ネットワークとは、複数のコンピューター間を接続する技術です。インターネットが最も主流なネットワークの形態で、TCP/IP・HTTP・DNSなどの様々なプロトコルや、ルータやサーバーなどの様々な機器の上に成り立っています。