
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で質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
C# シリアル通信でデータ受信時の欠損について
C言語・C++・C#
-
TCP/IP のパケットの分断と結合について
UNIX・Linux
-
地学について
宇宙科学・天文学・天気
-
-
4
ギタリストの爪をきれいにしたい
楽器・演奏
-
5
エクセルのセル分割
アプリ
-
6
うちの猫をいじめてしまいます。
猫
-
7
消しゴムはんこで、なぜここまで値段が跳ね上がるのですか?
モバオク!
-
8
ラベルの文字列の長さが変わったときに、ラベル位置を自動で変更する方法
C言語・C++・C#
-
9
ピルの偽薬は飲まなくても平気ですか?
婦人科の病気・生理
-
10
C#で起動時のフォームを非表示にした後、Showで表示したいのですが
その他(プログラミング・Web制作)
-
11
仕事のあと、帰り際に「今度ライン教えて」と気になる職場男性に言いました。 (その場で交換しなかったの
片思い・告白
-
12
不登校で出席日数が足りなくても行ける私立高校や公立高校はありますか? 中3です。 できれば埼玉県内で
高校受験
-
13
離れ乳って、どう?
その他(芸能人・有名人)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
教えて下さい
-
「0x00ff0000」?
-
EXCELVBAでSQLserverからデータ...
-
不規則なデータのfft処理
-
Fortran カンマを含む数値デー...
-
C言語で2桁Hex文字列を10進...
-
配列でデータが入っている要素...
-
【エクセル】測定時間がバラバ...
-
C言語を用いて、GNUPLOTでリア...
-
VBA 空白セルを削除ではない方...
-
<VB>String→Object
-
プログラミング python pandas ...
-
Visual Basic によるNC機械制御
-
S9タイプからXタイプにデータ...
-
ハミング窓関数とFFT(高速フー...
-
C# でDataTableの更新を高速化...
-
特定のデータの抽出方法を教え...
-
GridViewの行の一部を複数行にする
-
この行は既に別のテーブルに属...
-
メモ帳(テキストデータ)をExc...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
教えて下さい
-
【エクセル】測定時間がバラバ...
-
メモ帳(テキストデータ)をExc...
-
この行は既に別のテーブルに属...
-
多量のSUMIF式を軽くしたい
-
配列でデータが入っている要素...
-
EXCELVBAでSQLserverからデータ...
-
エクセルで2つの時系列のデー...
-
ACCESS VBA インデックスが有効...
-
二分探索の平均探索回数
-
Accessで該当データにフラグを...
-
ビットシフトについて
-
Rails4 Redirect_Toで送信
-
CString型の文字列連結について
-
[C言語] コメント文字列を無視...
-
ブレーカー落ちで壊れたりしな...
-
ActiveReportについて
-
バーコードリーダーの読込デー...
-
C# でDataTableの更新を高速化...
-
プログラミング python pandas ...
おすすめ情報