接続切断判別
- 題名: 接続切断判別
- 著者: smith
- 日時: 2004/11/22 5:32:05
- ID: 7575
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[1]: 接続切断判別
- 著者: 秋
- 日時: 2004/11/22 12:24:24
- ID: 7580
- この記事の返信元:
-
[7575] 接続切断判別 smith 2004/11/22 5:32:05
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 接続切断判別
- 著者: ゆ
- 日時: 2004/11/22 16:59:03
- ID: 7589
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[2]: 接続切断判別
- 著者: smith
- 日時: 2004/11/22 20:54:58
- ID: 7593
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[3]: 接続切断判別
- 著者: smith
- 日時: 2004/11/22 20:58:40
- ID: 7594
- この記事の返信元:
- この記事への返信:
- ツリーを表示
- 題名: Re[4]: 接続切断判別
- 著者: smith
- 日時: 2004/11/24 2:22:29
- ID: 7610
- この記事の返信元:
- この記事への返信:
- ツリーを表示
分類:[.NET]
簡単なチャットソフトのようなものを作りたい(というかほとんどできている)のですが、
サーバ側が一方的に接続をCloseしてもクライアント側が切断されたことに気づかなくて困っています。
もちろん、サーバ側のソフトをEndしてしまえば、
クライアントがメッセージを送信しようとしたときに失敗してエラーが出るのですが、
サーバ側でTcpListenerがStartしてしまっているためか、
接続をCloseしただけだとクライアントはその後もメッセージの送信に成功してしまい、
エラーが出ません。(エラーが出てほしい)
そのチャットソフトの構造は以下のとおりです。
System.IO、System.Text、System.Net.SocketsをImportsしておきます。
sessionをTcpClient型で宣言しておき、
サーバ側では、
Dim TcpListener As TcpListener = New TcpListener(1000)
TcpListener.Start()
While TcpListener.Pending = False
Application.DoEvents()
End While
session = TcpListener.AcceptTcpClient()
として接続要求待ちと要求受信後の接続を行い、
クライアント側では、
Do
Try
session = New TcpClient("192.168.0.2", 1000)
Exit Do
Catch
Application.DoEvents()
End Try
Loop
として接続に成功するまで接続を試み続けます。
接続後、サーバ、クライアントとも、お互いにメッセージの送受信方法は同じで、
メッセージの受信は、
Dim ns As NetworkStream = session.GetStream()
Dim br As New BinaryReader(ns)
Dim mlength(0) As Byte
Dim data As Byte()
While ns.DataAvailable = False
Application.DoEvents()
End While
で受信待ち、
mlength = br.ReadBytes(1)
data = br.ReadBytes(mlength(0))
TextBox2.AppendText(Encoding.Unicode.GetString(data) & vbCrLf)
で受信と受信したメッセージをTextBox2に追記していきます。
メッセージの送信は、
Dim ns As NetworkStream = session.GetStream()
Dim bw As New BinaryWriter(ns)
Dim mbytes As Byte() = Encoding.Unicode.GetBytes(TextBox1.Text)
Dim mlength(0) As Byte = mbytes.Length
bw.Write(mlength)
bw.Write(mbytes)
でTextBox1内の文字列を送信します。
ここまでは問題ないのですが、サーバ側が一方的に接続を切りたい場合、
サーバ側でsession.Close()としても、クライアントはメッセージの送信時にエラーを出さず、
サーバをEndして終了してしまうと、
クライアントがメッセージを送信しようとしたときに失敗してエラーが出ます。
切断する際にクライアントに「切断するぞ」というような信号を送信すればよいのですが、
インターネットを経由していたりして接続が不安定になっているときなど、
「サーバがメッセージを送信しようとしたときに失敗したらそのクライアントはClose」
というようにしたいので、
その後クライアントがメッセージを送信しようとしたときに接続が安定していると、
送信に失敗したことにならず、エラーが出ません。
これは、完全に接続を切断できていないということなのでしょうか。
正しい切断方法や対策法がありましたら教えてください。
説明が長々しくて分かりにくいかもしれませんが、よろしくお願いします。