- - PR -
.Net Frameworkのソケット通信のSDKについて初歩的な質問
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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/ | ||||||||
|
投稿日時: 2004-07-06 08:18
えーと、accept(2) は listen(2) していた sofd のコピーをつくって clfd として返すようになっていると思います。 で、clfd のほうでは接続が確立し、sofd のほうでは新しい接続を 待つ、ということで。 ポート番号は同じです。 新しく受け付ける接続では、すでに確立している接続とIPアドレス・ (むこう側の)ポート番号の一方または双方が異なっているはず なので、そこで区別がつきます。 | ||||||||
|
投稿日時: 2004-07-06 08:31
ありゃりゃ、コピーでしたか。「どうなっているんだろう」と、デバッガで色々インスペクトしたことは憶えているのですが、何かとごっちゃになっていたらしい。 ありがとうございました。 | ||||||||
|
投稿日時: 2004-07-06 16:40
見逃していました(((^^;
同じパラメータでソケットを生成するけど新しい識別子ということですか!!! ・・・ socket()で生成した識別子のまんまという認識でいました。。。恥ずかしい。 | ||||||||
|
投稿日時: 2004-07-16 15:48
お騒がせしました、半人前です。
まずは本スレにレスをくださったみなさんに心からお礼を述べたいと思います。 2千を超える閲覧数の中に.Net Frameworkのソケット通信に興味を持っている方々がいたとして その方々に対して(誤った認識を持っている)自分の発言により更に誤った認識を広めたらどう しよう・・と思い報告が遅れた事をお詫びします。 自分の資質(適正)の問題が一番なんでしょうけど、調べる手順にもマズかったところが多々あ った事が分かりました。 で、スレ中の議題で宙ぶらりんになっている感のあるものに対して、自分がこの間調べて分かっ たものに関して報告します。 ○ブロックモード・非ブロックモードについて 同期受信の場合はSocket.Blockingプロパティを設定して切り替える。 ブロックする場合はtrue、非ブロックはfalse。デフォルトはtrue。非同期受信では効果なし。 非同期受信の場合はManualResetEvent クラスを使用する。 ○同期(サーバー)・非同期(サーバー)について 受信の処理を @接続要求を受け入れるところまで A接続要求を受け入れてから(データ読み取り) こう2つに二分します。 処理は@→A→@→A→・・・と続いていくわけですが 同期受信は@→Aが終わってから@へ 非同期受信は@→Aが終わらなくても@へ と言う事だったんですね(^^; | ||||||||
|
投稿日時: 2004-07-16 16:09
○Qooさんの出題
(Q1) サーバ側で、ソケットの接続待ち受けで開かれるポート番号は 複数のクライアントから同時に接続可能である。 (Q2) サーバ側で、ソケットの接続待ち受けで開かれるポート番号は 1つのクライアントが接続している間は、他のクライアント からは接続できない。 実験をしました(^^;、同じポートを使って 一方はTCPで送信しっ放し(クライアント側からすれば、connect要求が通ったら、後は一定間隔で送信しっ放し) その一方、UDPで送信を試みる。 結果は・・、送(受)信できます。ポートモニターなるフリーウェアで見ても双方接続状態でした。 ということで (Q3) サーバ側で、ソケットの接続待ち受けをするプログラムは 同じポート番号を割り当てる仕組みになっていれば 一つしか起動できない。 起動できるということになります。 | ||||||||
|
投稿日時: 2004-07-16 16:24
○Jittaさんからの助言について
Solarisでの経験では、サーバ側ではクライアントからの通信を着信すると、そのクライアントとの通信専用にポートを複製し、新しいポート番号に続きのデータがはいるようにしてから、ライブラリを復帰します。 このため、復帰後にforkしたりマルチスレッドにしたりすると、複数の着信を同時に(実際にはタイムシェアード)処理することが可能となります。 fork等しなければ、処理されない間、データはポートの待ち行列にはいります。 ・・・、数年前に同じSolarisでちょっとした帳票発行アプリを開発したときに通信部 分の担当者さんから「ポートは概念的なもんだからね!」と言われた事を思い出し、や っとその言わんとしていた事が分かりました(^^; さて、非同期サーバーのSDKの説明に 非同期ソケットは、システムのスレッド プールから複数のスレッドを使用して、着信 した接続を処理します。あるスレッドで接続の受け入れを行い、着信した各接続を処理 するために別のスレッドを使用し、接続からのデータを受信するためにまた別のスレッ ドを使用します。 とあるんですけども、これってプログラミング時に意識させないで(非同期サーバーの 例)「処理を分ける」という同じ効果を狙ってるんだな・・と思えたりします。 | ||||||||
|
投稿日時: 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重にハマっています。 |