C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: 別プログラムから値を操作


(過去ログ 80 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■47411 / inTopicNo.1)  別プログラムから値を操作
  
□投稿者/ もんた (26回)-(2010/03/02(Tue) 00:59:05)

分類:[C#] 

2010/03/02(Tue) 21:56:38 編集(投稿者)
こんにちは、以前チャットアプリケーションの作り方について聞いた者です。

現在、下記のサイトを参考にして簡単な通信プログラムを作成しました。

http://codezine.jp/article/detail/22

このサイトのサーバー側プログラムにクライアントが接続したときの処理がありますが、
これを「とある変数が変化した時にその変数をクライアントへ返す」という処理にする予定です。


■サンプルの一部■
//BeginAcceptのコールバック
private static void AcceptCallback(System.IAsyncResult ar)
{
    //サーバーSocketの取得
    System.Net.Sockets.Socket server =
        (System.Net.Sockets.Socket) ar.AsyncState;

    //接続要求を受け入れる
    System.Net.Sockets.Socket client = null;
    try
    {
        //クライアントSocketの取得
        client = server.EndAccept(ar);
    }
    catch
    {
        System.Console.WriteLine("閉じました。");
        return;
    }

    //クライアントが接続した時の処理をここに書く
    //ここでは文字列を送信して、すぐに閉じている
    client.Send(System.Text.Encoding.UTF8.GetBytes("こんにちは。"));  ←この部分を変える
    client.Shutdown(System.Net.Sockets.SocketShutdown.Both);
    client.Close();

    //接続要求待機を再開する
    server.BeginAccept(
        new System.AsyncCallback(AcceptCallback), server);
}
■ここまで■


とりあえずこの部分は1秒ごとに値をチェックし、値が変化すればループを抜けるという処理にしようと思っています。

ここからが本題なのですが、肝心の「チェック対象の変数を書き換える」という処理が分からず困っています。
別のプログラムからサーバープログラム内の変数を書き変えたいと思っています。
多分チャットで発言する機能と同じようなものだとは思うのですが・・・。

最終的には、
@クライアントがサーバに接続して非同期通信開始
Aクライアントで入力した値をサーバー側に渡す
B以前の値から変化していれば、クライアント側にその値を返す
という処理にしたいと思っています。

どなたか良い方法や解説サイトを教えて頂けるとありがたいです。

引用返信 編集キー/
■47486 / inTopicNo.2)  Re[1]: 別プログラムから値を操作
□投稿者/ kaishu (6回)-(2010/03/04(Thu) 02:27:31)
kaishu さんの Web サイト
2010/03/04(Thu) 02:32:34 編集(投稿者)

No47411 (もんた さん) に返信

> ここからが本題なのですが、肝心の「チェック対象の変数を書き換える」という処理が分からず困っています。
> 別のプログラムからサーバープログラム内の変数を書き変えたいと思っています。
> 多分チャットで発言する機能と同じようなものだとは思うのですが・・・。


 参考にされたサイトのなかの「クライアントの作成」のところに記述された
SocketのBeginReceiveとEndReceiveメソッドを使えばいいのではありませんか?
--> サーバ側のソケット(server)に、server.BeginReceive()する感じです。


> 最終的には、
> @クライアントがサーバに接続して非同期通信開始
> Aクライアントで入力した値をサーバー側に渡す
> B以前の値から変化していれば、クライアント側にその値を返す
> という処理にしたいと思っています。

 BeginReceiveのコールバックでクライアントから受信したデータを
一時的に変数等に退避しておいて、次に、受信した際、変化している
か比較し、変化していたら、クライアントのソケットに、送信する
(client.Send)ようにすればいいと思います。





引用返信 編集キー/
■47530 / inTopicNo.3)  Re[2]: 別プログラムから値を操作
□投稿者/ もんた (27回)-(2010/03/05(Fri) 00:27:07)
No47486 (kaishu さん) に返信

返信ありがとうございます。
これはサーバー側でもクライアント側で利用しているのと同じようにBeginReceiveを使用するという解釈でよろしいでしょうか?
試しにクライアントが接続したときに処理を行う部分("こんにちは"の文字列を送っている部分)の直前で「StartReceive(soc)」と
記述しBeginReceiveを行っているメソッドへ飛ばしてみたのですが、以下のような例外(SocketException)が発生してしまいます。
(socというのはサーバー側のソケット情報です)


ソケットが接続されていないか、sendto呼び出しを使ってデータグラムソケットで送信するときにアドレスが
指定されていないため、データの送受信を要求することは禁じられています。


BeginReceiveの使い方はサンプルのクライアント側と殆ど同じです。
今はソースが見れないので書けず申し訳ありません・・・。

やはりBeginReceiveを呼び出す位置が悪いのでしょうか?
引用返信 編集キー/
■47532 / inTopicNo.4)  Re[3]: 別プログラムから値を操作
□投稿者/ kaishu (7回)-(2010/03/05(Fri) 04:00:43)
kaishu さんの Web サイト
2010/03/05(Fri) 04:06:12 編集(投稿者)
2010/03/05(Fri) 04:05:15 編集(投稿者)
2010/03/05(Fri) 04:02:15 編集(投稿者)

No47530 (もんた さん) に返信

> これはサーバー側でもクライアント側で利用しているのと同じようにBeginReceiveを使用するという解釈でよろしいでしょうか?

 そういう解釈で OK です。

 例外(SocketException)が発生しているそうですが、「ソケットが接続されていない」、
「ソケットで送信するときにアドレスが指定されていない」といわれても、ここでは、
サーバ側でクライントからの接続を非同期受信したいところですからね。
(接続されていなくて当然ですし・・・)

よくわかりませんね。

参考にされたサイトでは、実際のソースもダウンロードできるようなので、
ご覧になるとヒントが得られるかもしれません。
私も見てみて、気付いた点があれば、またご連絡します。


引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -