
Visualstudio 2013 を使用して C# で開発を行っています。
Socket Classを使用してデータの送受信をするプログラムを作成しているのですが、
非同期でデータを受信する際に取りこぼしなくデータを受信させる方法で悩んでいます。
現在行っているのは、
socket.BeginReceiveでデータ受信時のコールバック関数を登録し受信開始。
データ受信時のコールバック関数の中で
len = socket.EndReceive(ar);
byte[] rcvBuff = (byte[])ar.AsyncState;
でデータとサイズを取得
再度socket.BeginReceiveで受信開始。
としています。
悩んでいるのは EndReceive から、二回目のBeginReceiveまでの間に送られたデータを取りこぼしてしまうのではないかということです。
認識として間違っていたら指摘頂きたいです。
また、別の方法で非同期で取りこぼしなく受信できるやり方が有りましたらヒントでもよいので教えていただけたらと思います。
よろしくお願いします。
No.1ベストアンサー
- 回答日時:
> 悩んでいるのは EndReceive から、
> 二回目のBeginReceiveまでの間に送られたデータを取りこぼしてしまうのではないかということです。
大丈夫よん。
プログラムがBeginReceive~EndReceiveでひとかたまりの受信データブロックを取得するのはあくまで「同じコンピューターのOSから」なので、その時「同じコンピューターのOS」は相手からのデータ送信をどんどこどんどこ受け付けている。
そもそも最初のBeginReceiveをしなくてもコネクションが確立された瞬間からOSは相手からデータを受け取っているのだ。
これは、次のようなイメージだ。
(1)あなたは一階に総合受付がある雑居ビルで仕事をしてる。(あなた=プログラム、総合受付=NIC)
(2)一階の総合受付の中にあなた宛の郵便受けを置いたとする。(Socket#Listen、Socket#Accept)
(3)郵便屋さんはそこにあなた宛の郵便をどんどこどんどこ持ってくる。
(4)あなたは部下に「郵便受けに何かないか見てこい。何もなかったら何か来るまでそこで見張ってろ。郵便が有ったら報告せよ。」という。(BeginReceive)
(5)部下は降りていった時に郵便があればそのまま持って上がる。無ければ来るまで待つ。(コールバック)
(6)あなたは部下から郵便を受け取って再び(4)を命じる。(EndReceive、AsyncState、BeginReceive)
ここで、(3)と(4)~(6)は非同期にかつ独立して行われる。あなたや部下が郵便を取りに行こうが取りにいくまいが郵便屋さんは郵便を持ってきて便受けに入れるだけだ。具体的には(6)でEndReceiveとBegenReceiveの間に郵便屋さんが来たとしてもそれは便受けに郵便を入れるだけだ。
もちろん、あなたのプログラムが終了しようとしている時に郵便受けに溜まってるのにあなたが読まなかった郵便はプログラム終了(というかSocket#Close)とともにロストする。
TCPはこの郵便受けがぱんぱんになってしまったら郵便屋さん(というか郵便を送りつけてくる相手)にちょっと待って貰うとかそういう制御もしている。
イメージ的にはこんなイメージであなたはBeginReceiveとEndReceiveを実行するタイミングによる伝送データロストを気にする必要はない。もし本当にそんなちょっとしたタイミングの差でそんな事が起こるんならMicrosoftさんだってそんなコンポーネント作らんじゃろ。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Androidスマホのデータ移行が終わらない
- TCP/IP通信時のサーバーからの受信
- +メッセージの送受信。 au(uq mobile)のデータ回線でdocomoの電話番号の+メッセージ
- iPhoneには、なぜ僕が合計3台持ちしているGalaxy A22やXperiaXZ1、arrows
- 皆さんiPhoneは、機能が少な過ぎますか?? iPhoneには、なぜ僕がAndroid合計3台持ち
- メールサーバーは「PC側がメールをDL済みか否か?」を何を以て感知するのか?
- 「プロトコル」の定義について
- 携帯電話の居場所信号の発信タイミング
- OSI参照モデルの各層の役割がわかりません。
- 3つのプロシージャをまとめたら実行時エラー発生で対応不能
このQ&Aを見た人はこんなQ&Aも見ています
-
性格の違いは生まれた順番で決まる?長男長女・中間子・末っ子・一人っ子の性格の傾向
同じ環境で生まれ育っても、生まれ順で性格は違うものなのだろうか。家庭教育研究家の田宮由美さんに教えてもらった。
-
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
UDP処理のエラーについて
Visual Basic(VBA)
-
TCP/IP通信時のサーバーからの受信
C言語・C++・C#
-
-
4
TCP/IP のパケットの分断と結合について
UNIX・Linux
-
5
NetworkStreamからのRead()で、処理が止まる(C#)
C言語・C++・C#
-
6
winsockでソケット通信の開発をしていますが、
C言語・C++・C#
-
7
recv関数でフリーズしてしまう
C言語・C++・C#
-
8
UDP通信におけるbind関数について
C言語・C++・C#
-
9
C#でButtonのフォーカス枠を消したいのですが
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テレビのチャンネルを変更した...
-
教えて下さい
-
シーケンサにパソコンからアク...
-
【エクセル】測定時間がバラバ...
-
配列でデータが入っている要素...
-
[C言語] コメント文字列を無視...
-
VBA 該当データがない時 ...
-
ビットシフトについて
-
Accessで該当データにフラグを...
-
csvファイルに複数行あるデ...
-
【EXCEL VBA】ブック内の特定の...
-
C++ 音のリアルタイム処理
-
PIC12F675 キャリブレーション...
-
VBA 空白セルを削除ではない方...
-
多量のSUMIF式を軽くしたい
-
FFTを使って信号から特定の周波...
-
VBA 毎日取得するデータを順番...
-
ウィンドウ枠の固定を行の2箇所...
-
ACCESS VBA インデックスが有効...
-
EXCEL VBAの質問です '選択した...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
配列でデータが入っている要素...
-
メモ帳(テキストデータ)をExc...
-
【エクセル】測定時間がバラバ...
-
javaでDBからデータを取ってき...
-
エクセルで2つの時系列のデー...
-
VBA 空白セルを削除ではない方...
-
二分探索の平均探索回数
-
曲線グラフからピーク値を求め...
-
VBAを使ってOutlookメール本文...
-
Accessで該当データにフラグを...
-
S9タイプからXタイプにデータ...
-
多量のSUMIF式を軽くしたい
-
この行は既に別のテーブルに属...
-
シーケンサにパソコンからアク...
-
ノイズの入った波形をきれいな...
-
モジュラス103の算出方法について
-
ユーザーフォームのテキストボ...
-
ACCESSからEXCELに出力する際、...
-
VBAでシートからコンボボックス...
おすすめ情報