- ベストアンサー
c# ネットワークプログラム
c#でネットワークプログラムを作る際、 SocketクラスとTcpListener・TcpClientクラスのどちらで 作るのが良いのでしょうか。 やりたいことは、サーバーとクライアントを接続して送受信させるだけです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
No.1です。 回答続編です。 とはいえ、こちらも難航中ですが。 (何となくTCP-Clientは判ってきたかなという感じですね) >1秒間隔でポーリングして受信がある場合は受信を送信処理が >ある場合は送信処理を1つのコネクションでさせる場合は >どうすればいいのでしょうか。(c言語のselect関数相当) …確か、Socketの方にはSelectを持っていた気がします。 調べてみてください。 しかし、一般的にポートは6万個しかありませんので。 大規模なアクセスをも想定する場合は、1メソッドでポイと 捨ててみてもいいような気もします。 でないとポートが利用人数分消費されます。 TCP/IPはどうも、永続的なセッション情報を元来あまり保証し なさそうな雰囲気ですので、(FrameworkのTCP-Clientは 低レイヤーの切断情報などステータスをうまく取れない模様。) きっと[Data.Length][Separetor][Data] というような、 RS-232Cのようなベタな「俺プロトコル」を適当につくり、 TimeOutベースで審査&そのたびにスレッドを捨てるという やりかたでもいいんじゃないかなとも思えます。 >また、お勧めのサイトとかありましたら教えてください。 当方の情報源は。 1.VS2008のMSDN(ネットのは古い場合がある) 2.C#500の技とかいう書籍 3.海外のWebサイト ですね。 日本は情報があまり見当たりません。 Code Projectというサイトあたりを中心に物色しています。 私は、ClickOnceでTCP-Clientを配布して使えないかなという 実験中で。今日のところは、HTTPサーバとおしゃべりできた程度 です…
その他の回答 (3)
No.1です。 当方、本日はほとんどC#は進捗なしなのですが… んー、Socketには、SelectメソッドもPollメソッドもあるような 気がします。 MSDN Libraryですぐに見つかりましたけど…。 ま、.NETはFrameworkのクラス構造に慣れるまでに一苦労ですね。 たかだか文字列処理でも、Stringか、Encodingか、Convertか。 どこにあるのかすぐに探しちゃいますので(笑) 最近の言語は、コンポーネントを使いこなすのが主流ですので。 こういう辞書で単語を探すようなスタイルが一般なのかも 知れませんね。 プログラムによっては、恐ろしく短いコードで実現でき、かつ 速度もモノによってはC++ + MFCよりも速いらしいので。 侮れないのですが。
お礼
再三にわたるご回答誠にありがとうございました。とても役立ちましたありがとうございました。
No.1です。 最後の「私は、」は特に意味無いです。 訂正まで。
然るに。 まさに、あなたと同じ部分に着手している者です。(笑) 私は一応、他言語のWinsockの通信程度は作成したことがありますが、 C#では…今のところ完璧なものはできていません。 (独自プロトコルの某サーバを構築しようとたくらんでおります。) さて。 質問の解ですが。 Microsoft様がおっしゃるには 「普通のTCP/IP通信のプログラムを作る時に、ベラボーに速い プログラムを一からゴリゴリ作り、最高のパフォーマンスを 得るにはSocketを。 普通のものでよければ、TCP-Listner/TCP-Client/UDP-Listenerを 利用した方がいいよ」とヘルプに書いてありました。 今覗いてみている雰囲気では、TCP~のほうがライブラリ内の メソッドやエラー制御などが簡略化されているようでして。 Socket~のほうは、IPv4以外のプロトコルも考慮していそうで、 最初から手を出すにはちょっと難しそうです。 作ったことがなければTCP~から作ったほうがいいようです。 ちなみに、私は同じところを着手していて。 …どうも、Listener周りのスレッド&例外のところがうまくいかない のでいろいろ試行錯誤中です…。 以上でいかがでしょうか? 私は、
お礼
ご回答ありがとうございます。 私は、C言語でソケット通信プログラムを作成したことがあるので Socketの方を選択しようかと思います。 最初は敷居が低そうなTCP~で作っていたのですがyama-taku様と同様の 辺りでうまくいかなくて挫折しました。 それから、1秒間隔でポーリングして受信がある場合は受信を送信処理がある場合は送信処理を1つのコネクションでさせる場合はどうすればいいのでしょうか。(c言語のselect関数相当) また、お勧めのサイトとかありましたら教えてください。
お礼
度々のご回答誠にありがとうございます。 送受信のslecet関数は確かにC言語の時には使用していましたが、c#ではないような気がします。 そこで受信処理と送信処理をそれぞれ別スレッドで処理させようと作っていたのですが、コネクションを確立したソケットをそれぞれのスレッドでどのようにすれば(共有)いいのか試行錯誤中です。 それにしても参考になるサイトが少ないですね。