![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
C#ですが、Readメソッドを使ってバイト配列を
読み込むとき、次の処理に移るタイミングが
よく分かりません(ソケットからデータを受ける時)。
例えば、JAVAなどのreadLine()などは、改行や、
EOFで、次の行に移ります。
Readは、このような、区切りが無いのでよく分かり
ません。
0バイトで移るのかとも思いましたが、受信バイト数
を数えると、文字数以上のバイトはいっさい受信
されていないので、送信側で、自動で0バイトを
つけているようでもありません。
それでも送信側で文字を送ると、その送信単位で
次の処理に移ってくれています。
送信から次の送信までの区切りは何で認識して
いるのでしょうか(区切りがない以上、受信バッファ
がいっぱいになるまで、待ってもよさそうですが)。
なにか分かる人がいましたらお願いします。
No.2ベストアンサー
- 回答日時:
C# はよく知らないので、私の知っている範囲での話になってしまいますけど、参考まで。
。。受信通知のタイミングは、「何か受信したら、その時点で通知する」と思います。
UDP であれば、送信側が Write したサイズ分受信したところでソケットから受信通知があがってくるので、そこで Read すればそのサイズ分のデータが受信できることになります。
MTU 以上のデータが Write された場合には、IP で UDP パケットの Fragment 分割処理が入ることになりますので、受信側では IP Reassemble 処理され、結果として送信側が Write したサイズ分受信することになります。
# UDP を使う上位プロトコルで、そんなに大きなサイズのデータを送るような
# ものがあるのかどうかは知りませんけど。。。
TCP の場合、話がもう少々複雑になりますが、基本的には1パケットを受信したところで受信通知があがってくると思って良いと思います。
TCP では、MSS 単位でデータをパケット分割します。
ですので、送信側が MSS より大きなパケットを Write した場合、無条件で MSS 単位に分割されてしまいます。
そのような場合には、受信側は MSS 単位に分割された1パケット受信したところでソケットから受信通知があがってくることになります。
そこで Read すれば、当然そのサイズ分だけデータを受信することになります。
ただし、送信データをすべて受信したところで受信通知をあげるようにすることも可能です。
TCP では、受信データを一区切りまでソケットで保留しておくことが可能なんです。
# その区切りは送信側の TCP がつけることになります。
TCP では「ひとつのデータ」という概念はなく、あくまで連続したデータ (ストリームといいます) としてしか意識していません。
ですので、受信通知のタイミングは、1パケット受信のタイミングであるか、あるいは送信側がつけた区切りのタイミングであるか、いずれかでしかデータ受信通知をあげることができません。
受信バッファがいっぱいになったタイミングで受信通知をあげてしまうと、そのバッファに空きができるまでデータが受信できなくなります。
こうすると、効率的にもあまりよくないですよね?
ちなみに、受信バッファがいっぱいになる前に、しきい値まで受信したら上位に通知するという仕組みを使っているものもありますけど、TCP ではそのような方式は使っていないですね。
No.1
- 回答日時:
C#というか一般的にソケット通信の話ですが
例えばSendで瞬間的に何度も文字列を送った場合
その文字列は受け取ったときに
連結する可能性があります。
また逆に一度に大量の文字列(例えば10000文字)とか
送った場合
Read時に分割する可能性があります。
その辺はOSのMTUの設定に依存します。
>区切りが無いのでよく分かりません。
つまり区切りになる文字を自分で定義するか、
サイズの情報も一緒に送るしかありません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 片思い・告白 送信取り消ししてもいいですか? 2人とも同じバイト先で、相手はフリーターでアルバイトのみの実家暮らし 8 2023/03/29 20:59
- 片思い・告白 恋愛相談 4 2023/05/04 07:49
- Outlook(アウトルック) メール送信できない 3 2022/07/20 09:07
- UNIX・Linux redmineにメールを飛ばす方法 1 2022/09/13 22:02
- UNIX・Linux Postfixでドコモメールに送信すると届くまで10分ぐらいかかる 6 2023/03/05 13:56
- ガラケー・PHS SMSメールの受信遅延原因はガラケー自体の欠陥では 8 2022/08/06 11:46
- Gmail gmailで独自ドメインアドレスのメールが届かない件 1 2023/08/25 23:24
- 会社・職場 質問です。 私が派遣で仕事をしていた所で知り合ったバイトのおじさんの話です。多分40代くらいです。 5 2022/12/12 23:36
- ビジネスマナー・ビジネス文書 応募したバイト先から、電話で、適性検査をインターネット上で受けてほしいと言われました。その後メールで 1 2022/10/27 14:46
- Outlook(アウトルック) 未読ならば受信トレイから削除する 2 2023/02/12 19:21
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
ソケットプログラミング(配列に...
-
Readメソッドが次の行に処理を...
-
ASP.NET C#でPOST受信
-
VB2010で、シリアル通信の方法...
-
シリアル通信時のデータ受信方法
-
TCPのプログラミングで質問…と...
-
TCP/IPで受信エラー
-
Outlookの「受信日時」「送信者...
-
VB2005でTCP/IPソケット通信で...
-
TCPでパケットロス?
-
TCP/IP のパケットの分断と結合...
-
CRC-CCITTに関しての仕様とサン...
-
RS232cを用いた送信プログラム
-
「TCPは全二重可能」の意味
-
パソコンに詳しい方教えて下さ...
-
java.lang.NumberFormatExcepti...
-
Windows上のファイル操作の履歴...
-
バッチファイルでディレクトリ...
-
Zipファイルをエクセルに指定変...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Outlookの「受信日時」「件名」...
-
TCP/IP のパケットの分断と結合...
-
RS232cを用いた送信プログラム
-
UDP受信時の通信異常検知について
-
ASP.NET C#でPOST受信
-
シリアル通信時のデータ受信方法
-
Outlookの「受信日時」「送信者...
-
TCPでパケットロス?
-
TCPのプログラミングで質問…と...
-
recv関数の戻り値について
-
DHCPOFFERの受信について
-
msgrcv( )で領域破壊?
-
パケット受信 recvfrom( )につ...
-
「TCPは全二重可能」の意味
-
C#にてCTI。RS232Cの受信と送信...
-
CRC-CCITTに関しての仕様とサン...
-
MTUで!!
-
PC98で232c送信winndowで受信で...
-
VB2010で、シリアル通信の方法...
-
winsockを使ったTCP及びUDP通信...
おすすめ情報