如何设置CONNECT TIMEOUT时间

如何设置CONNECT TIMEOUT时间,第1张

1、设置socket为非阻塞模式

2、connect()连接

3、如果出错,用select()系统调用对其进行超时检测,看在给定的时间内socket是否变得可写

[cpp] view plain copy print?

int fd = socket(PF_INET,SOCK_STREAM,0)

...

int flags = fcntl(fd,F_GETFL,0)

fcntl(fd,F_SETFL,flags | O_NONBLOCK)

int n = connect(fd,(struct sockaddr*)&addr,sizeof addr)

if(n <0)

{ // EINPROGRESS表示connect正在尝试连接

if(errno != EINPROGRESS &&errno != EWOULDBLOCK)

return 1

struct timeval tv

tv.tv_sec = 10

tv.tv_usec = 0

fd_set wset

FD_ZERO(&wset)

FD_SET(fd,&wset)

n = select(fd+1,NULL,&wset,NULL,&tv)

if(n <0)

{ // select出错

perror("select()")

close(fd)

return 1

}

else if (0 == n)

{ // 超时

cerr<<"Timeout." <<endl

close(fd)

return 1

}

else

{ // 连接成功

cerr <<"Connectd." <<endl

}

}

fcntl(fd,F_SETFL,flags &~O_NONBLOCK) // 设为阻塞模式

针对套接 *** 作设置默认超时的概述StreamSocket类实现Windows运行时应用中的TCP套接字。TCP套接字必须建立连接才能发送或接收任何网络数据。Windows8.1、WindowsPhone8.1和WindowsServer2012中实现的基础TCP套接字会针对所有的TCP连接套接字 *** 作设置默认超时。对于每个来源和目标地址对,在使用主机名或终结点时,默认超时为3分钟(180秒)。因此,如果目标主机名有两个IP地址,那么,只有在经过大约6分钟之后,连接 *** 作才会超时。对于使用Windows运行时应用的客户体验来说,这个默认超时可能过长。因此,使用StreamSocket类的应用可能希望针对流套接字连接 *** 作设置较短的自定义超时。在发送或接收网络数据时,DatagramSocket和StreamSocket类没有默认超时。因此,任何发送或接收 *** 作都将永远等待。使用套接字的Windows运行时应用可能希望针对这些 *** 作设置超时以获取更好的客户体验。StreamSocketListener类将永远侦听和等待传入的连接请求。如何针对套接字 *** 作设置自定义超时JavaScript语言支持计时事件,这些事件可以按指定的时间间隔执行某些代码。JavaScript计时事件setInterval()-按指定的时间间隔(毫秒)反复执行某个函数。setTimeout()-在等待指定的毫秒之后执行一次某个函数。计时事件函数是在HTMLDOMWindow对象中实现的。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连接 *** 作实现自定义超时。JavaScriptvarclientSocket=nullvartimeout=10000//10secondsfunctionopenClient(){varserverHostName=newWindows.Networking.HostName("")varserviceName="http"//displayStatus("Client:connectionstarted.")clientSocket=newWindows.Networking.Sockets.StreamSocket()//varpromise=clientSocket.connectAsync(serverHostName,serviceName)WinJS.Promise.timeout(timeout,clientSocket.connectAsync(serverHostName,serviceName).then(function(){//displayStatus("Client:connectioncompleted.")//Doyoursocketoperationshere.},function(reason){//Therearemanyreasonsforthisfailure:thepromisemighthave//timedout,ortheserverhostrefusedtheconnection,orthere//wasanTCPissue,orseveralotherpossibilities.//displayStatus("Client:connectionfailed.")//displayStatus(reason.message)clientSocket.close()clientSocket=null}))}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/10877422.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-12
下一篇 2023-05-12

发表评论

登录后才能评论

评论列表(0条)

保存