したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | メール | |

C#、Vb2005 でSocket通信

1RYU:2010/06/08(火) 00:04:33
いつも参考にさせていただいております。
ソケット通信での受信イベントについて、少々ご指導ください。
C#、Vb2005 でSocket通信 (複数クライアント&非同期処理) では、

public partial class FomServer : Formの
別スレッドからメインスレッドのテキストボックスに書き込むデリゲート
として、直接テキストボックスに書いていますが、イベントを使用して、
処理する方法を教えてください。

/** セカンドスレッドで実行されるサーバーのListen **
の所で、イベント受信時のメソッドを加え、handler.StartRead();

受信イベントは、
private void OnReadComplete(IAsyncResult ar)の
if (bytesRead > 0)  { に データを返すコード
を書いています。

上記にて、1度は正常に受信データを確認できますが、
2回め以降は、有効ではないスレッド間の操作とエラーが起こります。

根本的に間違っているかもしれませんが、リスナーが受診時にデータを
受け取れる処理ができればと考えています。クラスを独立させるため、
なるべくイベントで収集出きればと考えます。

以上、よろしくお願いします。

2igoten:2010/06/08(火) 08:08:04
ちょっとそのコードだけでは何が悪いか判断できませんが、
一回目のデーターを受信したスレッドと2回目のデーターを受信した
スレッドが異なっているのでしょう。
クライアントの方が既に接続してるにもかかわらず再度
接続要求を出して新しいスレッドを作ってしまっているなんて
ことはありませんか。

3RYU:2010/06/08(火) 18:41:09
ありがとうございます。

恐らく、下記コードのdoの内側にイベント用のコードを書いている事が原因と思いますが、
どのように修正して良いのか分かります。ご指導願います。

private void EventListen()
{
string S_ip = Rip1.Text;
int S_port2 = int.Parse(rpt2.Text);

//TcpListenerを作成
IPAddress ipAddress = IPAddress.Parse(S_ip);
IPEndPoint localEndPoint2 = new IPEndPoint(ipAddress, S_port2);
Event_listner = new TcpListener(localEndPoint2);
Event_listner.Start();


// クライアントの接続を受けるための永久ループ
try
{

do
{
// Listener.AcceptSocketは同期メソドで接続要求が有るまで
//値を返さずここで待機します
// 新しい接続要求ががあると接続を許可して
// 新しいソケットを返します

Socket socketForClient_e = Event_listner.AcceptSocket();

//クライアント毎の接続とフォームのインスタンスを渡す
ServerOpener handler_e = new ServerOpener(socketForClient_e, this);

handler_e.OnRecive += new ServerOpener.Server_recive(on_read);


//読み込みを開始
handler_e.StartRead();

} while (true);
}


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板