- PR -

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

投稿者投稿内容
Jubei
ぬし
会議室デビュー日: 2002/03/02
投稿数: 830
お住まい・勤務地: 関西
投稿日時: 2004-07-05 23:48
諸農です。

期待していた内容でなくて残念でした。

.NET FrameworkのSocketクラスはWinSockを基盤に構築されているので、
WinSockも含めて基本を理解したいという事でしたら次の書籍もいいかも。

・WinSock2.0プログラミング
 ISBN:4797306882
 ソフトバンク

VC++が基本の内容になってしまいますが、
・ゼロから学ぶVisualC++
 ISBN:4822216934
 日経BP

・猫でもわかるネットワークプログラミング
 ISBN:4797323604
 ソフトバンク

・Win32ネットワークプログラミング
 ISBN:4756120113
 アスキー

猫でもシリーズとゼロからシリーズ以外は出版されたのが
4〜5年前になりますので、今でも書店に並んでいるか
どうかは判りません。

_________________
諸農和岳
Powered by Turbo Delphi & Microsoft Visual Studio 2005

十兵衛@わんくま同盟
http://blogs.wankuma.com/jubei/
ぽんす
ぬし
会議室デビュー日: 2003/05/21
投稿数: 1023
投稿日時: 2004-07-06 08:18
引用:

Jittaさんの書き込み (2004-07-05 08:52) より:
注目はacceptです。
if ((clfd = accept(sofd, &cltAddr, &addrlen)) < 0)
ここで、sofdは入力引数で、上(C_createSocket関数内)で作ったファイルディスクリプタ(WindowsではSOCKET構造体が相当)を渡します。戻り値は"新しい"ファイルディスクリプタ(WindowsではSOCKET構造体)です。この"新しい"とは、servicesファイル(WindowsXPではSYSTEM32/drivers/etecディレクトリ内)に定義されておらず、現在開いていないポートが使われます(そういうことだったと思う)。


えーと、accept(2) は listen(2) していた sofd のコピーをつくって
clfd として返すようになっていると思います。
で、clfd のほうでは接続が確立し、sofd のほうでは新しい接続を
待つ、ということで。
ポート番号は同じです。
新しく受け付ける接続では、すでに確立している接続とIPアドレス・
(むこう側の)ポート番号の一方または双方が異なっているはず
なので、そこで区別がつきます。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-07-06 08:31
引用:

ぽんすさんの書き込み (2004-07-06 08:18) より:

えーと、accept(2) は listen(2) していた sofd のコピーをつくって
clfd として返すようになっていると思います。
(以下略)


ありゃりゃ、コピーでしたか。「どうなっているんだろう」と、デバッガで色々インスペクトしたことは憶えているのですが、何かとごっちゃになっていたらしい。
ありがとうございました。
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-07-06 16:40
見逃していました(((^^;

引用:

ぽんすさんの書き込み (2004-07-06 08:18) より:
引用:

Jittaさんの書き込み (2004-07-05 08:52) より:
注目はacceptです。
if ((clfd = accept(sofd, &cltAddr, &addrlen)) < 0)
ここで、sofdは入力引数で、上(C_createSocket関数内)で作ったファイルディスクリプタ(WindowsではSOCKET構造体が相当)を渡します。戻り値は"新しい"ファイルディスクリプタ(WindowsではSOCKET構造体)です。この"新しい"とは、servicesファイル(WindowsXPではSYSTEM32/drivers/etecディレクトリ内)に定義されておらず、現在開いていないポートが使われます(そういうことだったと思う)。


えーと、accept(2) は listen(2) していた sofd のコピーをつくって
clfd として返すようになっていると思います。
で、clfd のほうでは接続が確立し、sofd のほうでは新しい接続を
待つ、ということで。
ポート番号は同じです。
新しく受け付ける接続では、すでに確立している接続とIPアドレス・
(むこう側の)ポート番号の一方または双方が異なっているはず
なので、そこで区別がつきます。



同じパラメータでソケットを生成するけど新しい識別子ということですか!!!
・・・
socket()で生成した識別子のまんまという認識でいました。。。恥ずかしい。
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-07-16 15:48
お騒がせしました、半人前です。

まずは本スレにレスをくださったみなさんに心からお礼を述べたいと思います。

2千を超える閲覧数の中に.Net Frameworkのソケット通信に興味を持っている方々がいたとして
その方々に対して(誤った認識を持っている)自分の発言により更に誤った認識を広めたらどう
しよう・・と思い報告が遅れた事をお詫びします。

自分の資質(適正)の問題が一番なんでしょうけど、調べる手順にもマズかったところが多々あ
った事が分かりました。

で、スレ中の議題で宙ぶらりんになっている感のあるものに対して、自分がこの間調べて分かっ
たものに関して報告します。

○ブロックモード・非ブロックモードについて

 同期受信の場合はSocket.Blockingプロパティを設定して切り替える。
  ブロックする場合はtrue、非ブロックはfalse。デフォルトはtrue。非同期受信では効果なし。
 非同期受信の場合はManualResetEvent クラスを使用する。

○同期(サーバー)・非同期(サーバー)について

 受信の処理を
 @接続要求を受け入れるところまで
 A接続要求を受け入れてから(データ読み取り)
 こう2つに二分します。

 処理は@→A→@→A→・・・と続いていくわけですが
 
 同期受信は@→Aが終わってから@へ
 非同期受信は@→Aが終わらなくても@へ

 と言う事だったんですね(^^;
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-07-16 16:09
○Qooさんの出題

 (Q1)
 サーバ側で、ソケットの接続待ち受けで開かれるポート番号は
 複数のクライアントから同時に接続可能である。
 (Q2)
 サーバ側で、ソケットの接続待ち受けで開かれるポート番号は
 1つのクライアントが接続している間は、他のクライアント
 からは接続できない。

  実験をしました(^^;、同じポートを使って
  一方はTCPで送信しっ放し(クライアント側からすれば、connect要求が通ったら、後は一定間隔で送信しっ放し)
  その一方、UDPで送信を試みる。

  結果は・・、送(受)信できます。ポートモニターなるフリーウェアで見ても双方接続状態でした。

  ということで

 (Q3)
 サーバ側で、ソケットの接続待ち受けをするプログラムは
 同じポート番号を割り当てる仕組みになっていれば
 一つしか起動できない。

  起動できるということになります。
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-07-16 16:24
○Jittaさんからの助言について

Solarisでの経験では、サーバ側ではクライアントからの通信を着信すると、そのクライアントとの通信専用にポートを複製し、新しいポート番号に続きのデータがはいるようにしてから、ライブラリを復帰します。
このため、復帰後にforkしたりマルチスレッドにしたりすると、複数の着信を同時に(実際にはタイムシェアード)処理することが可能となります。
fork等しなければ、処理されない間、データはポートの待ち行列にはいります。

 ・・・、数年前に同じSolarisでちょっとした帳票発行アプリを開発したときに通信部
 分の担当者さんから「ポートは概念的なもんだからね!」と言われた事を思い出し、や
 っとその言わんとしていた事が分かりました(^^;

 さて、非同期サーバーのSDKの説明に

 非同期ソケットは、システムのスレッド プールから複数のスレッドを使用して、着信
 した接続を処理します。あるスレッドで接続の受け入れを行い、着信した各接続を処理
 するために別のスレッドを使用し、接続からのデータを受信するためにまた別のスレッ
 ドを使用します。

 とあるんですけども、これってプログラミング時に意識させないで(非同期サーバーの
 例)「処理を分ける」という同じ効果を狙ってるんだな・・と思えたりします。
隣の古柴
ベテラン
会議室デビュー日: 2004/06/04
投稿数: 94
投稿日時: 2004-07-16 16:56

締めですが、.NETのソケットサービスはWinsock32APIのマネージ版で、そのWinsock32API
は・・と結局UNIXのソケット実装まで遡らなければ私には整理がつきませんでした。

その際に参考にしたURLを下記にまとめます。

○プログラム講座
 http://hp.vector.co.jp/authors/VA003991/kouza/senior/index.html

 →ここのソケットプログラミング入門1と2

○Programming UNIX Sockets in C - Frequently Asked Questions
 http://www.kt.rim.or.jp/~ksk/sock-faq/unix-socket-faq-ja.html

 →ここの全部

○Winsock Programmer's FAQ
 http://www.kt.rim.or.jp/~ksk/wskfaq-ja/

 →ここの全部

書籍としてはJubeiさんに紹介された

・WinSock2.0プログラミング
 ISBN:4797306882
 ソフトバンク



・インターネットプログラミング 300の技
 ISBN4-7741-1052-3
 技術評論社

になります。

まだ腹の中に残って消化しきれないんですが(^^;、すっかり2重にハマっています。

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