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

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

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

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

Q&A

解決済

3回答

975閲覧

バイト数の違いが分かりません

Jhon_McClane

総合スコア48

C

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

0グッド

0クリップ

投稿2020/07/15 08:39

編集2020/07/15 08:54

前提・実現したいこと

cで通信するためにreadの関数を使用しています。
サーバーから文字列を受信するのですが
readから返ってくるバイト数とbufのバイト数の違いが分かりません。
bufはstrlen(buf)で数えています。
例:文字列が-9878の場合
readのバイト数は6, bufのバイト数は5でした。 
readのバイト数が1多いのはbufの終端文字を数えているためでしょうか。

該当のソースコード

ssize_t read(int fd, char *buf, size_t count);

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

JM Projectから少しコードを引用
https://linuxjm.osdn.jp/html/LDP_man-pages/man2/read.2.html

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

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

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

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

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

maisumakun

2020/07/15 08:42

「bufのバイト数」はどうやって数えましたか?
Daregada

2020/07/15 08:44

「readから帰ってくるバイト数」はまだreadの返り値だとわかりますが、「bufのバイト数」は意味不明です。strlenの返り値のことでしょうか。
SHOMI

2020/07/15 08:49 編集

区切りがわかるように終端の'\0'をつけて送られた文字列を受信し、bufはstrlen()で数えたんじゃないですか? で、readは実際に受信した'\0'を含めた6バイト、strlen()は'\0'をカウントしないので5が返ったと。
Jhon_McClane

2020/07/15 08:52

bufはstrlenで返しています
dodox86

2020/07/15 09:27

サーバー側から例えばsendまたはwrite(socket, "-9878", 6); と送信したらこのようなケースになる、と言い換えたら分かるでしょうか。
guest

回答3

0

質問の原因自体は文字列の終端文字の話みたいですが、

それ以前の問題として
TCP/IPの場合、サーバーがNバイト送ったからread一発でNバイト受信できるはず...なんて考えると時として痛い目を見ますよ。
ここ(いろいろ古くなってますが)の20番とか。

もう一つ、「C言語の規則」を、それが必ずしも適用されない通信の世界に持ち込んだりすることにも注意深くあるべきだと思います。TCP/IPでデータを送ってくる相手はC言語の世界の住人ではないかも知れません。文字列の終端が\0だという期待は勝手には出来ません。それを期待していいという特別な条件があるなら、質問でもそれを明示して下さい。

投稿2020/07/15 13:05

thkana

総合スコア7703

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

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

Jhon_McClane

2020/07/16 06:07

質問の段階でもう少し丁寧に記述すべきでした。 学校からの課題でNegalアルゴリズムを回避することを行っていたのですが、TCP_NODELAYなどを他にも様々なことを試していく段階でなかなか上手く生きませんでした。先生に相談したところ、readのバイト数とbufのバイト数を比較するだけでもパケットが統合されてしまっているかを判断できるとご教授くださいましたので、そのヒントを頼りに実行した結果の違いをこちらで確認しました。
guest

0

readのバイト数が1多いのはbufの終端文字を数えているためでしょうか。

おそらく、はい。
とりあえずbufの中身を

C

1for( size_t i = 0; i < readの戻り値; i++){ 2 print("%X", buf[i]); 3}

のようにして確認してみてはいかがでしょうか。

投稿2020/07/15 08:47

編集2020/07/15 08:47
can110

総合スコア38341

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

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

0

ベストアンサー

readが返すのは実際に読み取られてbufに入れられたバイト数で、strlenが返すのはbufに格納された文字列の長さ(ヌル文字は数えない)ですから、違って当然ですよね。

投稿2020/07/15 09:14

Daregada

総合スコア11990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問