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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

ネットワーク

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

Q&A

解決済

4回答

2910閲覧

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

strike1217

総合スコア651

C

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

ネットワーク

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

0グッド

0クリップ

投稿2016/12/26 23:36

C

1while(1){ 2 sin_size = sizeof(struct sockaddr_in); 3 new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size); 4 if(new_sockfd == -1) 5 printf("Error Connection\n"); 6 7 printf("PORT of Server : %d, Connection from client : %s\n", ntohs(client_addr.sin_port),inet_ntoa(client_addr.sin_addr)); 8 send(new_sockfd, fer, strlen(fer), 0); 9 recv_length = recv(new_sockfd, &buffer, 1024, 0) - 2; 10 while(recv_length > 0){ 11 printf("Recieved : %d Byte packet\n", recv_length - 2); 12 printf(">>>"); 13 for(i = 0; i <= recv_length - 2; i++){ 14 if(!isspace(buffer[i])) 15 printf("%c", buffer[i]); 16 } 17 printf("\n"); 18 19 for(i = 0; i<= 1024; i++) 20 buffer[i] = ' '; 21 recv_length = recv(new_sockfd, &buffer, 1024, 0); 22 }

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

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

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

蛇足:

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

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

投稿2016/12/27 00:32

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/12/27 00:36

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

0

ベストアンサー

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

c

1if(!isspace(buffer[i]))

投稿2016/12/26 23:57

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/12/27 00:24

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

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 00:20

ardin

総合スコア544

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/12/27 00:25

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

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 00:12

編集2016/12/27 00:22
Y.H.

総合スコア7914

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/12/27 00:22

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

2016/12/27 02:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問