• ベストアンサー

c# ネットワークプログラム

c#でネットワークプログラムを作る際、 SocketクラスとTcpListener・TcpClientクラスのどちらで 作るのが良いのでしょうか。 やりたいことは、サーバーとクライアントを接続して送受信させるだけです。

質問者が選んだベストアンサー

  • ベストアンサー
noname#245936
noname#245936
回答No.3

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サーバとおしゃべりできた程度 です…

oeppu08
質問者

お礼

度々のご回答誠にありがとうございます。 送受信のslecet関数は確かにC言語の時には使用していましたが、c#ではないような気がします。 そこで受信処理と送信処理をそれぞれ別スレッドで処理させようと作っていたのですが、コネクションを確立したソケットをそれぞれのスレッドでどのようにすれば(共有)いいのか試行錯誤中です。 それにしても参考になるサイトが少ないですね。

その他の回答 (3)

noname#245936
noname#245936
回答No.4

No.1です。 当方、本日はほとんどC#は進捗なしなのですが… んー、Socketには、SelectメソッドもPollメソッドもあるような 気がします。 MSDN Libraryですぐに見つかりましたけど…。 ま、.NETはFrameworkのクラス構造に慣れるまでに一苦労ですね。 たかだか文字列処理でも、Stringか、Encodingか、Convertか。 どこにあるのかすぐに探しちゃいますので(笑) 最近の言語は、コンポーネントを使いこなすのが主流ですので。 こういう辞書で単語を探すようなスタイルが一般なのかも 知れませんね。 プログラムによっては、恐ろしく短いコードで実現でき、かつ 速度もモノによってはC++ + MFCよりも速いらしいので。 侮れないのですが。

oeppu08
質問者

お礼

再三にわたるご回答誠にありがとうございました。とても役立ちましたありがとうございました。

noname#245936
noname#245936
回答No.2

No.1です。 最後の「私は、」は特に意味無いです。 訂正まで。

noname#245936
noname#245936
回答No.1

然るに。 まさに、あなたと同じ部分に着手している者です。(笑) 私は一応、他言語のWinsockの通信程度は作成したことがありますが、 C#では…今のところ完璧なものはできていません。 (独自プロトコルの某サーバを構築しようとたくらんでおります。) さて。 質問の解ですが。 Microsoft様がおっしゃるには 「普通のTCP/IP通信のプログラムを作る時に、ベラボーに速い  プログラムを一からゴリゴリ作り、最高のパフォーマンスを  得るにはSocketを。  普通のものでよければ、TCP-Listner/TCP-Client/UDP-Listenerを  利用した方がいいよ」とヘルプに書いてありました。 今覗いてみている雰囲気では、TCP~のほうがライブラリ内の メソッドやエラー制御などが簡略化されているようでして。 Socket~のほうは、IPv4以外のプロトコルも考慮していそうで、 最初から手を出すにはちょっと難しそうです。 作ったことがなければTCP~から作ったほうがいいようです。 ちなみに、私は同じところを着手していて。 …どうも、Listener周りのスレッド&例外のところがうまくいかない のでいろいろ試行錯誤中です…。 以上でいかがでしょうか? 私は、

oeppu08
質問者

お礼

ご回答ありがとうございます。 私は、C言語でソケット通信プログラムを作成したことがあるので Socketの方を選択しようかと思います。 最初は敷居が低そうなTCP~で作っていたのですがyama-taku様と同様の 辺りでうまくいかなくて挫折しました。 それから、1秒間隔でポーリングして受信がある場合は受信を送信処理がある場合は送信処理を1つのコネクションでさせる場合はどうすればいいのでしょうか。(c言語のselect関数相当) また、お勧めのサイトとかありましたら教えてください。

関連するQ&A

  • C#でネットワークプログラミング

    C#でネットワークプログラムをしているものです。 本を読みながら勉強しているのですが C#だとTcpListener・TcpClientを用いれば 簡単にチャットを作れますよね。 で、他にも方法があって Socket通信と非同期なSocket通信というものが ありますが、 実際問題としてこの二つの違いというのが よくわかりません。 どっちでもいいじゃんと思えるのです。 違いをわかりやすく教えていただけると幸いです。 具体的にチャット(3人以上でできるもの) だとどれがどうとかありますでしょうか?

  • 簡単なネットワークプログラムなのですが・・・

    ネットワーク通信の基礎を学ぼうと、いろいろなサイトをみながらSocket通信の簡単なメッセージ送受信を行おうとしているのですが、streamを使って送信したメッセージを送信、又は受信するときにsocketを閉じないと送信できません。 そして常に受信させたいのですが、socketを閉じているため、nullexceptionになってしまいます。 何か別の手はありますでしょうか・・・? 現在↓のような感じで行っています。 private void 待機ToolStripMenuItem_Click(object sender, EventArgs e) { //サーバーを開始 Int32 port = 9999; IPAddress localAddr = IPAddress.Parse("127.0.0.1"); server = new TcpListener(localAddr, port); server.Start(); threadA = new Thread(recvData); threadA.Start(); } // 受信用(マルチスレッド) public void recvData() { //接続待機 this.Invoke(new MyDelegate(delegate { textBox1.Text = "接続待機中"; })); TcpClient client = server.AcceptTcpClient(); //接続 this.Invoke(new MyDelegate(delegate { textBox1.Text = "接続されました"; })); NetworkStream stream = client.GetStream(); // 無限ループ while (true) { Byte[] bytes = new Byte[20]; //わざと小さく取ってある。 int i; //メッセージを受信 while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) { String data = System.Text.Encoding.UTF8.GetString(bytes, 0, i); Console.WriteLine(String.Format("受信: {0}", data)); } client.Close(); }

  • C#とTCP/IPを利用したサーバープログラム(複数クライアント対応)

    VC#とTCP/IPを利用したサーバープログラムを制作しています。 サーバーとクライアントの1対1での通信には成功したのですが、1つのサーバーで複数のクライアントと通信する方法がわかりません。 同じポート番号を利用できるのでしょうか。ただ単にTcpClientの配列を作ればいいのでしょうか。やはりクライアントの数だけスレッドを作らないといけないのでしょうか。 環境はWindowsVistaでMicrosoft Visual C# 2008 Express Editionを使用しています。 詳しい方がいましたらぜひ具体的なC#でのコード等を教えてください。 よろしくお願いいたします。

  • クライアント上のC++でサーバーとソケット送信

    クライアント(Windows7)上でC++を使って、サーバー側(Windows)に対してデータを送りたいです (ソケット通信?)。 サーバ受信側はC#を使ったプログラムで以下のような感じで考えてます。 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Net; using System.Net.Sockets; using System.IO; namespace ConsoleApplication1 {   class Program   {     static void Main(string[] args)     {       int port = 2222;       System.Net.IPAddress ip = IPAddress.Parse("127.0.0.1");       System.Net.Sockets.TcpListener server = new TcpListener(ip, port);       Console.WriteLine("Enter押してください");       ConsoleKeyInfo info = Console.ReadKey();       if (info.Key == ConsoleKey.Enter)       {         Console.WriteLine("サーバー待機中");         server.Start();         TcpClient client = server.AcceptTcpClient();         NetworkStream ns = client.GetStream();         StreamWriter sw = new StreamWriter(ns);         Console.WriteLine(sw);       }     }   } } C++のことがよくわかってないので、送信側でC++を使ってどのように 送信すればいいのかわかりません。 送信するデータはINT型で、1秒間に1回、繰り返し送ります。 よろしくお願いします。

  • C++でマルチスレッドによるネットワークプログラムを行いたいと考えてお

    C++でマルチスレッドによるネットワークプログラムを行いたいと考えております。 質問の内容は「どちらの方が速度的に有利か?」という二択です。 Linux、C++にてサーバープログラムを作成する予定で、実装したい内容は複数人の映像チャットのようなものをP2P型ではなくサーバー-クライアント型で行います。 1部屋で10人の通信を行うとして10部屋の通信を扱いたいです。(部屋の数は変動します) そこで以下の方法のどちらが効率的かを教えていただきたいです。 方法1 外部と通信するスレッドは1つで使用するポートも一つ(100人からの接続をポーリングで対処) 部屋の中身の処理をマルチスレッド化しておき通信システムが各部屋と情報をやりとりする 方法2 部屋ごとにスレッドを作成 各部屋(スレッド)が通信機能を持ち、ポートは部屋ごとに変える 方法1、2以外に、どちらも変わらないという選択肢でも構いません。 どうぞよろしくお願い致します。

  • プログラム内でネットワークドライブを指定して接続することは可能でしょうか?

    現在サーバ側のパソコンにて起動時にクライアント側のフォルダをネットワークドライブにて接続しています。 クライアント側が先に立ち上がっている場合は問題ないのですが、サーバ側が先に立ち上がった場合に当然ネットワークドライブは確立されておらず、クライアントからプログラムを動作させた場合にエラーになってしまいます。 そこで、サーバ側にて周期的にネットワークドライブの接続を行なってやりたいのですが、そのようなことは可能でしょうか? ご存知の方がいましたら回答をお願い致します。 よろしくお願いします。

  • C#での画像送信プログラム(ネットワーク)

    C#での画像送信プログラム(ネットワーク) C#でのネットワークプログラミングでデスクトップ画像の送受信を行おうとしているのですが サーバ側 :デスクトップの画像を取得→byte配列に格納送信。 ビューア側:byte配列を受信→img型に変換→pictureBoxに表示という流れで行っています。 しかし、ファイルを受信して変換する際にSystem.ArgumentExceptionというエラーが発生します。 ヘルプを見てみると引数のパラメータが違うとかいてあるのですが、引数の値は間違いないと思うんですよ・・・ なぜエラーが発生しているのか全く理解できません。 ソースを公開するのにも、ServerとViewerの2個ではここにのせるのは大きいと思い、アップローダをおかりしました。 http://www1.axfc.net/uploader/He/so/260160 PW:1234 です。大変面倒だとは思いますが、見て指摘していただければ幸いです。 よろしくおねがいします!

  • VBでネットワークプログラムを作りたいのですが

    クライアントとサーバのコンピュータを2台用意してVisual Basicでこの2台をつなぐネットワークプログラムを作りたいのですがどのような方法がありますか?(CGIを使わずに)

  • サーバプログラム

    ネットワークアプリケーションとして、 複数のクライアントから接続要求を受け付けるサーバプログラムには どんなものがありますか? よろしくお願いします。

  • ネットワーク系プログラム

     ネットワークトラブルが起きた時、その原因が何かを調べる際にCmdでネットワークコマンドを入力して、設定にミスはないか、ネットワークの疎通、ホストのネット接続、プロキシ、DNS…等調べますが、これをC言語で一気に自動化し、なおかつ設定ミスを指摘してくれて治してくれるプログラムを作ろうかと思っているのですが無謀でしょうか?  

専門家に質問してみよう