none
关于socket.connected的问题 RRS feed

  • 问题

  • 我设计了一个telnet类,目前的问题是我想在下了exit命令,服务器端退出后,程序能马上引发一个exitScoket的事件。

    原来我想用connected,但发现这个属性根本不能确认socket当前状态。看了MSDN也确认了这个情况,MSND上介绍了一个非阻塞方式下调用SEND方法发送0字节的数据,我试了也没用(如以下代码)。根本就不引发异常。

    这就麻烦了。为什么windows自带的telnet程序只要下了exit命令,服务器退出后,就马可以得到服务器断开的消息呢,他是通过什么办法,确定服务器的当前socket连接状态。

    下面代码(MSDN里的实例)在服务器断开连接的情况下,根本就不会引发异常。


    Imports System.Net.Sockets

    Module Module1

        Sub Main()
            fd()
        End Sub
        Sub fd()

            Dim client As Socket
            client = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)
            ' .Connect throws an exception if unsuccessful
            client.Connect("192.168.0.6", 23)

            Do
                Threading.Thread.Sleep(500)

                ' This is how you can determine whether a socket is still connected.
                Dim blockingState As Boolean = client.Blocking
                Try
                    Dim tmp(0) As Byte

                    client.Blocking = False
                    client.Send(tmp, 0, 0)
                    Console.WriteLine("Connected!")
                Catch e As SocketException
                    ' 10035 == WSAEWOULDBLOCK
                    If e.NativeErrorCode.Equals(10035) Then
                        Console.WriteLine("Still Connected, but the Send would block")
                    Else
                        Console.WriteLine("Disconnected: error code {0}!", e.NativeErrorCode)
                    End If
                Finally
                    client.Blocking = blockingState
                End Try

                Console.WriteLine("Connected: {0}", client.Connected)

            Loop

        
        End Sub 'ConnectAndCheck


    End Module

    2010年1月24日 9:06

答案

  • 终于搞定了,原来是如此的简单,对端正常退出的话,我读取到字节数据都是0,如果不是正常退出呢,不正常退出,应用程序死掉是必然的。

    这是非正常退出的情况:
    这就好比 我和我朋友打电话,如果他有事出去没有和我讲,那我是不会知道的,只有我反复喂后几声后,他没回声,我就可以认为他不在了,我就可以挂电话了。

    这是正常退出的情况:
    我朋友告诉我他走了(SOCKET体现为接收到0个字节,但不调用异常),我可能会有几下几种处理方法,挂掉电话,没挂电话放在那里(没关闭socket)。

    2010年1月27日 14:33

全部回复

  • 好像没有人在~~~沙发~~~http://twtmo.forumotion.com/
    http://twtmo.forumotion.com 【AV女优video】
    2010年1月25日 1:00
  • 别沉了啊,这个问题让我好郁闷呢,自已来顶一下。

    2010年1月25日 8:56
  • 终于搞定了,原来是如此的简单,对端正常退出的话,我读取到字节数据都是0,如果不是正常退出呢,不正常退出,应用程序死掉是必然的。

    这是非正常退出的情况:
    这就好比 我和我朋友打电话,如果他有事出去没有和我讲,那我是不会知道的,只有我反复喂后几声后,他没回声,我就可以认为他不在了,我就可以挂电话了。

    这是正常退出的情况:
    我朋友告诉我他走了(SOCKET体现为接收到0个字节,但不调用异常),我可能会有几下几种处理方法,挂掉电话,没挂电话放在那里(没关闭socket)。

    2010年1月27日 14:33