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}))}欢迎分享,转载请注明来源:内存溢出
评论列表(0条)