如何针对套接字操作设置超时

2024-05-09 18:47

1. 如何针对套接字操作设置超时

针对套接字操作设置默认超时的概述
StreamSocket 类实现 Windows 运行时应用中的 TCP 套接字。TCP 套接字必须建立连接才能发送或接收任何网络数据。Windows 8.1、Windows Phone 8.1 和 Windows Server 2012 中实现的基础 TCP 套接字会针对所有的 TCP 连接套接字操作设置默认超时。对于每个来源和目标地址对,在使用主机名或终结点时,默认超时为 3 分钟(180 秒)。因此,如果目标主机名有两个 IP 地址,那么,只有在经过大约 6 分钟之后,连接操作才会超时。对于使用 Windows 运行时应用的客户体验来说,这个默认超时可能过长。因此,使用 StreamSocket 类的应用可能希望针对流套接字连接操作设置较短的自定义超时。
在发送或接收网络数据时,DatagramSocket 和 StreamSocket 类没有默认超时。因此,任何发送或接收操作都将永远等待。使用套接字的 Windows 运行时应用可能希望针对这些操作设置超时以获取更好的客户体验。
StreamSocketListener 类将永远侦听和等待传入的连接请求。
如何针对套接字操作设置自定义超时
JavaScript 语言支持计时事件,这些事件可以按指定的时间间隔执行某些代码。
JavaScript 计时事件
setInterval() - 按指定的时间间隔(毫秒)反复执行某个函数。
setTimeout() - 在等待指定的毫秒之后执行一次某个函数。
计时事件函数是在 HTML DOM Window 对象中实现的。
WinJS 命名空间为包括 WinJS.Promise 对象的 JavaScript 功能提供特殊的 Windows 库。timeout(timeout, promise) 方法包装 setTimeout 函数。如果在 timeout 参数中指定的毫秒数内未完成承诺,则 Windows 应用商店应用可以使用 timeout(timeout, promise) 方法来取消此承诺。 如果在 timeout 参数中指定的时间间隔内未完成套接字操作,则可以调用 timeout(timeout, promise) 方法并将套接字操作作为 promise 参数以使该操作超时。只要套接字操作仍在挂起,就能将其取消。
WinJS.Promise 对象和 timeout(timeout, promise) 方法可以与 Windows 运行时应用中的任何异步操作一起使用,包括所有的异步套接字操作。 对于正常的完成操作,可以在 timeout(timeout, promise) 方法调用之后添加“.then”。
对于所有这三个类来说,使用超时的基本模型是相同的。 以下讨论使用 StreamSocket 上的连接操作作为示例。在使用 DatagramSocket 或 StreamSocket 对象发送或接收网络数据时,或者在使用 StreamSocketListener 对象侦听传入连接时,可以使用相同的模型来实现超时。
创建一个 StreamSocket。
调用 timeout(timeout, promise) 方法并将其中一个 StreamSocket.connectAsync 方法作为 promise 参数。
在源代码的末尾添加 then(successFunction, errorFunction) 方法来处理成功和错误案例。
在出错时,关闭套接字。 在取消 StreamSocket 操作承诺之后,将无法再使用已取消的 StreamSocket。
以下示例将针对 StreamSocket 连接操作实现自定义超时。
JavaScript


var clientSocket = null;
var timeout = 10000; // 10 seconds
function openClient() {
    var serverHostName = new Windows.Networking.HostName("www.contoso.com");
    var serviceName = "http";
 
    // displayStatus("Client: connection started.");
    clientSocket = new Windows.Networking.Sockets.StreamSocket();
    //var promise = clientSocket.connectAsync(serverHostName, serviceName)
    WinJS.Promise.timeout(timeout, clientSocket.connectAsync(serverHostName, serviceName).then(function () {
        // displayStatus("Client: connection completed.");
        // Do your socket operations here.
 
    }, function (reason) {
        // There are many reasons for this failure: the promise might have 
        // timed out, or the server host refused the connection, or there
        // was an TCP issue, or several other possibilities.
 
        // displayStatus("Client: connection failed. ");
        // displayStatus(reason.message);
        clientSocket.close();
        clientSocket = null;
    }
    ));
}

如何针对套接字操作设置超时

2. 如何针对套接字操作设置超时

针对套接字操作设置默认超时的概述
StreamSocket 类实现 Windows 运行时应用中的 TCP 套接字。TCP 套接字必须建立连接才能发送或接收任何网络数据。Windows 8.1、Windows Phone 8.1 和 Windows Server 2012 中实现的基础 TCP 套接字会针对所有的 TCP 连接套接字操作设置默认超时。对于每个来源和目标地址对,在使用主机名或终结点时,默认超时为 3 分钟(180 秒)。因此,如果目标主机名有两个 IP 地址,那么,只有在经过大约 6 分钟之后,连接操作才会超时。对于使用 Windows 运行时应用的客户体验来说,这个默认超时可能过长。因此,使用 StreamSocket 类的应用可能希望针对流套接字连接操作设置较短的自定义超时。
在发送或接收网络数据时,DatagramSocket 和 StreamSocket 类没有默认超时。因此,任何发送或接收操作都将永远等待。使用套接字的 Windows 运行时应用可能希望针对这些操作设置超时以获取更好的客户体验。
StreamSocketListener 类将永远侦听和等待传入的连接请求。
如何针对套接字操作设置自定义超时
JavaScript 语言支持计时事件,这些事件可以按指定的时间间隔执行某些代码。
JavaScript 计时事件
setInterval() - 按指定的时间间隔(毫秒)反复执行某个函数。
setTimeout() - 在等待指定的毫秒之后执行一次某个函数。
计时事件函数是在 HTML DOM Window 对象中实现的。

3. 什么叫套接字超时~

  对于一个套接字的读写(read/write)操作默认是阻塞的,如果当前套接字还不可读/写,那么这个操作会一直阻塞下去,这就叫套接字超时;
  这样对于一个需要高性能的服务器来说,是不能接受的。所以,可以在进行读写操作的时候可以指定超时值,这样就读写操作就不至于一直阻塞下去。
  在涉及套接字的I/O操作上设置超时的方法有三种:
  1:调用alarm,它在指定的超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。
  2:在select中阻塞等待I/O(select有内置的时间限制),依次代替直接阻塞在read或write调用上。(linux2.6以后的内核也可以使用epoll的epoll_wait)
  3:使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。这个方法的问题在于并非所有的实现都支持这两个套接字选项。
  

什么叫套接字超时~