发布网友 发布时间:2022-04-23 22:37
共2个回答
热心网友 时间:2022-05-14 15:14
针对套接字操作设置默认超时的概述
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;
}
));
}
热心网友 时间:2022-05-14 16:32
付费内容限时免费查看回答亲,在涉及套接字的I/O操作上设置超时的方法有三种:
1:调用alarm,它在指定的超时期满时产生SIGALRM信号。这个方法涉及信号处理,而信号处理在不同的实现上存在差异,而且可能干扰进程中现有的alarm调用。
2:在select中阻塞等待I/O(select有内置的时间*),依次代替直接阻塞在read或write调用上。(linux2.6以后的内核也可以使用epoll的epoll_wait)
3:使用较新的SO_RCVTIMEO和SO_SNDTIMEO套接字选项。这个方法的问题在于并非所有的实现都支持这两个套接字选项。
注:上述这三个技术都适用于输入和输出操作(read、write,及其变体recv/send, readv/writev, recvfrom,sendto)。不过我们也期待可以用于connect的技术,因为TCP内置的connect超时相当长(典型值为75秒),而我们在写服务器程序的时候,也不会希望一个连接的建立需要花费这么长时间。select可用来在connect上设置超时的先决条件是相应的套接字是非阻塞的,而那两个套接字选项对connect并不适用;同时也应当指出,前两个技术适用于任何描述符,而第三个技术仅仅适用于套接字描述符。
希望对您有帮助呦