- PR -

.Net Frameworkのソケット通信のSDKについて初歩的な質問

投稿者投稿内容
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-06-28 09:36
C#というよりは、ソケット通信一般的な質問になってしまうかもしれないのですが・・

SDKで書かれているソケット同期・非同期の説明を読みつつ、載っているサンプルプ
ログラムを解析して

「ソケット通信の同期・非同期とは、(通信処理を)ブロックするかしないかという
 事とほぼ同義と捉えていいものなのだろうか?」

と疑問を持ちました。

識者の方、ご教示頂けないでしょうか?
よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-06-28 10:20
 通信処理じゃなくて、通信処理を呼び出しているプログラムをブロックする。

 プログラムをブロックさせずに通信を同期させることは可能。つまり、送信側と受信側のフェーズがあっていれば、受信側は送信側が送ってこない間は何をしていたってかまわない(どのレベルで同期を考えるかに依る)。
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-06-28 11:41
おぉ!レスありがとうございます。m(_)m
自分がちゃんと理解していないと言う事だけは分かってきました。

引用:

Jittaさんの書き込み (2004-06-28 10:20) より:
 通信処理じゃなくて、通信処理を呼び出しているプログラムをブロックする。




さらにいいでしょうか?(^^;
ここでのブロックという考え方は、例えば、同じポートに対してアクセスするプロセス
が複数あってバッティングを避けるためのものである・・、なんて捉えていいわけです
か?

uguuxp
会議室デビュー日: 2004/04/26
投稿数: 12
投稿日時: 2004-06-28 13:47
半人前様

引用:
ここでのブロックという考え方は、例えば、同じポートに対してアクセスするプロセス
が複数あってバッティングを避けるためのものである・・、なんて捉えていいわけです
か?



違うと思います。同じポートに複数のプロセス、というより複数のソケットをバインドすることはできるのでしょうか? 通常ですと、エラーが発生すると思います。「ブロックする」というのは、通信処理を使用するプログラムの実行を、アクセスが正常に完了するまで中断する、ということだと思います。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-06-28 14:01
引用:

半人前さんの書き込み (2004-06-28 11:41) より:

ここでのブロックという考え方は、例えば、同じポートに対してアクセスするプロセス
が複数あってバッティングを避けるためのものである・・、なんて捉えていいわけです
か?


 同じポートについては、オープンできません。バッティングは、オープンできないことで回避します。同じプログラム内であっても、同じポートを複数回オープンすることはできません。

 ここでいうブロックとは、関数呼び出しと同じイメージです。1つの関数から別の関数を呼び出すと、呼び出された関数に制御が移ります。そして、呼び出した関数はそこで実行が停止しています。この停止している状態が「ブロックされている」状態です。そして、呼び出された関数が終了すると、呼び出した関数の処理が続行します。

 ブロック呼び出しでは、ポートに荷物が届いていない場合、荷物が届くまで待ちます。非ブロック呼び出しでは、ポートに荷物が届いていなければ、「届いていないよ」という返事を返します。

 ブロックすると同期処理をさせやすいですが、他の処理ができないので、UIを持ったプログラムには不向きです。
 非ブロックだと、同期処理をする為に状態をどこかに退避させなければならないので、同期処理を行うのに若干手間がかかりますが、他の処理ができるので、UIを持ったプログラム向きです。
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-06-28 14:33
uguuxpさん、Jittaさん、レスありがとうございます。(TヘT)

揚げ足を取るつもりで聞いているのではないです、という事を最初にお断りさせて
頂いた上でさらに質問させてください(((^^;

サーバー・プログラムを念頭に置いた場合、サーバー・プログラムにとって同期・非同
期というのは、通信相手先(クライアント・プログラム)との【データのやり取り】が
同期・非同期である、という認識でいいんでしょうか?

Lichtenstein
ベテラン
会議室デビュー日: 2003/11/06
投稿数: 61
投稿日時: 2004-06-28 14:51
非同期で、無限ループで延々とブロックするプログラムを書く人もいますし、
同期で、スレッドを利用して通信以外の処理を同時にさせる人もいます。

つまり、プログラマに任されていると考えてよいかと。
ベンダーが便利な関数を用意してくれている訳ですから、それに沿ったプログラムが
好ましいのは当然ですが、それはルールではありません。
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-06-28 15:23
Lichtensteinさん、レスありがとうございます。

引用:

Lichtensteinさんの書き込み (2004-06-28 14:51) より:
非同期で、無限ループで延々とブロックするプログラムを書く人もいますし、
同期で、スレッドを利用して通信以外の処理を同時にさせる人もいます。

つまり、プログラマに任されていると考えてよいかと。
ベンダーが便利な関数を用意してくれている訳ですから、それに沿ったプログラムが
好ましいのは当然ですが、それはルールではありません。



すっきりしました(^^;
自分は、同期・非同期とブロック・非ブロックを一緒くたに捉えていました。
(どおりでハマるわけです・・)

ありがとうございました。

スキルアップ/キャリアアップ(JOB@IT)