积极答复者
如何判断StreamSocket是否在连接状态。

问题
-
hi各位大虾:
我正在用StreamSocket封装一个通信库,为了提升效率,socket使用了之后,都不直接关闭,使用一个列表保存起来,以便下次请求使用, 但是如果时间放得较长的时候, socket可能会与服务器断开了, 这样的话再次使用的时候,可能会通信失败。所以我们需要判断某个连接是否在connected状态, 但是StreamSocket并没有提供这个接口给我们使用。
我们怎样才能获取到一个StreamSocket的连接状态呢?
PS:目前我发现了 StreamSocket.StreamSocketInformation.RoundTripTimeStatistics 成员, 该成员应该是标记Ping的时间的,并且如果连接断开的时候,该成员的值是不正确的,是否可以使用这个成员来判断一个StreamSocket是否是connected?
- 已编辑 hejinyang 2012年12月3日 10:35
答案
-
通常情况下,通过非托管函数 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
全部回复
-
通常情况下,通过非托管函数 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
-
通常情况下,通过非托管函数 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商店应用
如果回复解答了您的问题,请记住标识回复为答案。如果认为答案没有提供帮助,您可以取消标识。
-
通常情况下,通过非托管函数 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是否与机器的性能有关? 是否与机器的特性相关? -
通常情况下,通过非托管函数 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关联?
-
通常情况下,通过非托管函数 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
想問的是...是不是可以這種方式判斷是否斷線呢