none
如何判断StreamSocket是否在连接状态。 RRS feed

  • 问题

  • hi各位大虾:

        我正在用StreamSocket封装一个通信库,为了提升效率,socket使用了之后,都不直接关闭,使用一个列表保存起来,以便下次请求使用, 但是如果时间放得较长的时候, socket可能会与服务器断开了, 这样的话再次使用的时候,可能会通信失败。所以我们需要判断某个连接是否在connected状态, 但是StreamSocket并没有提供这个接口给我们使用。

         我们怎样才能获取到一个StreamSocket的连接状态呢?

         PS:目前我发现了 StreamSocket.StreamSocketInformation.RoundTripTimeStatistics 成员, 该成员应该是标记Ping的时间的,并且如果连接断开的时候,该成员的值是不正确的,是否可以使用这个成员来判断一个StreamSocket是否是connected?

       


    2012年12月3日 8:45

答案

  • 通常情况下,通过非托管函数 getsockopt 或托管方法 Socket.Select, Socket.GetSocketOption 可以检索socket状态。但是,这些API都不能用于Windows Store apps。System.Net.Sockets 命名空间,也不适用于Windows Store apps。

    判断socket在建立连接后的状态,一般采用心跳方式,定时给服务器发送数据,一旦write失败就能获知连接已断开。

    如果再次使用已建立连接的socket,建议你捕获socket操作的异常,然后使用 SocketError.GetStatus ,获取StreamSocket的状态。通过 SocketErrorStatus ,你可以进一步了解详细的状态信息。

    此外,如果网络连接使用的时间较长,可以考虑使用 ControlChannelTrigger , 以节省系统资源等。



    Robin [MSFT]
    MSDN 论坛技术支持 | 如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    快速开发Windows商店应用
    如果回复解答了您的问题,请记住标识回复为答案。如果认为答案没有提供帮助,您可以取消标识。

    • 已标记为答案 hejinyang 2013年1月10日 9:10
    2012年12月4日 7:58
    版主

全部回复

  • 通常情况下,通过非托管函数 getsockopt 或托管方法 Socket.Select, Socket.GetSocketOption 可以检索socket状态。但是,这些API都不能用于Windows Store apps。System.Net.Sockets 命名空间,也不适用于Windows Store apps。

    判断socket在建立连接后的状态,一般采用心跳方式,定时给服务器发送数据,一旦write失败就能获知连接已断开。

    如果再次使用已建立连接的socket,建议你捕获socket操作的异常,然后使用 SocketError.GetStatus ,获取StreamSocket的状态。通过 SocketErrorStatus ,你可以进一步了解详细的状态信息。

    此外,如果网络连接使用的时间较长,可以考虑使用 ControlChannelTrigger , 以节省系统资源等。



    Robin [MSFT]
    MSDN 论坛技术支持 | 如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    快速开发Windows商店应用
    如果回复解答了您的问题,请记住标识回复为答案。如果认为答案没有提供帮助,您可以取消标识。

    • 已标记为答案 hejinyang 2013年1月10日 9:10
    2012年12月4日 7:58
    版主
  • 通常情况下,通过非托管函数 getsockopt 或托管方法 Socket.Select, Socket.GetSocketOption 可以检索socket状态。但是,这些API都不能用于Windows Store apps。System.Net.Sockets 命名空间,也不适用于Windows Store apps。

    判断socket在建立连接后的状态,一般采用心跳方式,定时给服务器发送数据,一旦write失败就能获知连接已断开。

    如果再次使用已建立连接的socket,建议你捕获socket操作的异常,然后使用 SocketError.GetStatus ,获取StreamSocket的状态。通过 SocketErrorStatus ,你可以进一步了解详细的状态信息。

    此外,如果网络连接使用的时间较长,可以考虑使用 ControlChannelTrigger , 以节省系统资源等。



    Robin [MSFT]
    MSDN 论坛技术支持 | 如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    快速开发Windows商店应用
    如果回复解答了您的问题,请记住标识回复为答案。如果认为答案没有提供帮助,您可以取消标识。

     ControlChannelTrigger  是用来做什么的,它是用来做消息推送的么?
    2012年12月4日 11:38
  • 通常情况下,通过非托管函数 getsockopt 或托管方法 Socket.Select, Socket.GetSocketOption 可以检索socket状态。但是,这些API都不能用于Windows Store apps。System.Net.Sockets 命名空间,也不适用于Windows Store apps。

    判断socket在建立连接后的状态,一般采用心跳方式,定时给服务器发送数据,一旦write失败就能获知连接已断开。

    如果再次使用已建立连接的socket,建议你捕获socket操作的异常,然后使用 SocketError.GetStatus ,获取StreamSocket的状态。通过 SocketErrorStatus ,你可以进一步了解详细的状态信息。

    此外,如果网络连接使用的时间较长,可以考虑使用 ControlChannelTrigger , 以节省系统资源等。



    Robin [MSFT]
    MSDN 论坛技术支持 | 如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    快速开发Windows商店应用
    如果回复解答了您的问题,请记住标识回复为答案。如果认为答案没有提供帮助,您可以取消标识。


    另外想问一下, 创建ControlChannelTrigger 的时候, 使用    RequestSoftwareSlot和 RequestHardwareSlot,有什么区别? RequestHardwareSlot是否与机器的性能有关? 是否与机器的特性相关?
    2012年12月11日 11:12
  • 通常情况下,通过非托管函数 getsockopt 或托管方法 Socket.Select, Socket.GetSocketOption 可以检索socket状态。但是,这些API都不能用于Windows Store apps。System.Net.Sockets 命名空间,也不适用于Windows Store apps。

    判断socket在建立连接后的状态,一般采用心跳方式,定时给服务器发送数据,一旦write失败就能获知连接已断开。

    如果再次使用已建立连接的socket,建议你捕获socket操作的异常,然后使用 SocketError.GetStatus ,获取StreamSocket的状态。通过 SocketErrorStatus ,你可以进一步了解详细的状态信息。

    此外,如果网络连接使用的时间较长,可以考虑使用 ControlChannelTrigger , 以节省系统资源等。



    Robin [MSFT]
    MSDN 论坛技术支持 | 如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    快速开发Windows商店应用
    如果回复解答了您的问题,请记住标识回复为答案。如果认为答案没有提供帮助,您可以取消标识。

    hello  Robin:

          我想通过streamSocket实现在后台下载数据功能,使用ControlChannelTrigger好像不太适合, 我们能否自定义一个trigger,然后使用BackgroundBuilder关联?

    2012年12月15日 1:23
  • 通常情况下,通过非托管函数 getsockopt 或托管方法 Socket.Select, Socket.GetSocketOption 可以检索socket状态。但是,这些API都不能用于Windows Store apps。System.Net.Sockets 命名空间,也不适用于Windows Store apps。

    判断socket在建立连接后的状态,一般采用心跳方式,定时给服务器发送数据,一旦write失败就能获知连接已断开。

    如果再次使用已建立连接的socket,建议你捕获socket操作的异常,然后使用 SocketError.GetStatus ,获取StreamSocket的状态。通过 SocketErrorStatus ,你可以进一步了解详细的状态信息。

    此外,如果网络连接使用的时间较长,可以考虑使用 ControlChannelTrigger , 以节省系统资源等。



    Robin [MSFT]
    MSDN 论坛技术支持 | 如果您对我们的论坛在线支持服务有任何的意见或建议,请通过邮件告诉我们。
    快速开发Windows商店应用
    如果回复解答了您的问题,请记住标识回复为答案。如果认为答案没有提供帮助,您可以取消标识。

         請問 我試做了一個client端,如下片段程式碼, 以下 reader為 DataReader 物件

         auto  readdata = create_task(reader->LoadAsync(MAX_READ_BUFFER));
         readdata.then([this, reader,&tempsocket] (task<unsigned int>  mytask))
        {  
                unsigned int d = mytask.get();
                int a = reader->UnconsumedBufferLength;

               ...........    

       }

       我發現 在server端斷線的時候 也不會 丟出exception ,可是 卻會進 .then區塊(通常我在server端丟資料給client時才會被觸發進此區塊 而且reader->UnconsumedBufferLength 不為0)   不過 reader->UnconsumedBufferLength 拿到的值會是0

       想問的是...是不是可以這種方式判斷是否斷線呢

    2013年1月3日 3:20
  • 使用心跳是socket联接中比较常用的方案,它在服务端与客户端之间使用0长度报文定时发送的方式,确定通讯是否正常。通常你的报文前四位(或你自己定义)为报文长度,如果你发送了0000,就说明报文长度为0,后面没有实质数据,它就成为检测通讯状态的依据了,如果超时未收到对方的心跳,在服务端可能需要重新启动服务,在客户端就需要重新建立联接了。

    这个方案在app应用中也是有效的。


    okokwukai

    2013年1月5日 2:37