int TimeOut=6000; //设置发送超时6秒
if(::setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
::closesocket (sock);
continue;
}
这是什么意思???
if(::setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
::closesocket (sock);
continue;
}
这是什么意思???
............
if(::setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
::closesocket (sock);
continue;
}
TimeOut=6000;//设置接收超时6秒
if(::setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO,(char *)&TimeOut,sizeof(TimeOut))==SOCKET_ERROR)
{
::closesocket (sock);
continue;
}
//设置非阻塞方式连接
unsigned long ul = 1;
ret = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul);
if(ret==SOCKET_ERROR)
{
::closesocket (sock);
continue;
} connect(sock,(PSOCKADDR)&inAddr,sizeof(inAddr))
//select 模型,即设置超时
struct timeval timeout ;
fd_set r; FD_ZERO(&r);
FD_SET(sock, &r);
timeout.tv_sec = 2; //连接超时15秒
timeout.tv_usec =0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret >0 )
{
//一般非锁定模式套接比较难控制,可以根据实际情况考虑 再设回阻塞模式
unsigned long ul1= 0 ;
ret = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul1);
if(ret==SOCKET_ERROR){
::closesocket (sock);
continue;
}
////////////////////以下是发送数据部分。
我想知道,setsockopt与select的作用各是什么?为什么在上面的代码中要这样写?(既用到了setsockopt,亦用到了select?)谢谢,在线等待!!
select:通过调用select函数可确定一个或多个套接字的状态,判断套接字上是否存在数据,
或者能否向一个套接字写入数据。
就这些,希望对你有帮助
................
??
1、虽然setsockopt可以设置的选项有很多,但如果只设置套接字的超时选项,那是不是这个套接字必须要设置成非阻塞的呢?就如我的这个例子一样!?
2、默认情况下(即不按照本例所写的那样),connect()函数是不是阻塞的?
3、select()中也有一个时间设置,它用在经过connect()操作后的套接字上,那么,这个select()成功返回后,意味着什么?也就是说select()操作成功了,那么对这个socket有什么影响?也就是说,这个socket经过select()操作,它可以进行写操作了?这个写操作意味着什么?相对于服务器端来讲!是不是经过select()操作后,且select()成功返回了,那么说明服务器端接收数据的套接字已经准备就绪了?即服务器端的recV()函数已经成功执行了?只等客户端的套接字来写数据了?
你的这个例子其实是一个阻塞模式的应用
你可以看到在connect之前设置成了非阻塞的,然后判断connect成功后,又设置成了阻塞的。之所以这么做是为了解决一个问题,也就是网上讨论的很多的超时连接的问题。2、默认情况下(即不按照本例所写的那样),connect()函数是不是阻塞的?
是阻塞的。
使用
unsigned long ul = 1;
ret = ioctlsocket(sock, FIONBIO, (unsigned long*)&ul);
后,connect 函数就不会阻塞了,而是直接返回。这个时候connect是否成功并不知道,而是靠后面的select函数来判断刚才的connect是否成功了,判断的方法是看在某个时间范围内这个socket是否可写,如果可写,就表明刚才的connect成功了ioctlsocket,setsockopt 和 select 没有什么关系,它们分别执行不同的功能3、select()中也有一个时间设置,它用在经过connect()操作后的套接字上,那么,这个select()成功返回后,意味着什么?也就是说select()操作成功了,那么对这个socket有什么影响?也就是说,这个socket经过select()操作,它可以进行写操作了?这个写操作意味着什么?相对于服务器端来讲!是不是经过select()操作后,且select()成功返回了,那么说明服务器端接收数据的套接字已经准备就绪了?即服务器端的recV()函数已经成功执行了?只等客户端的套接字来写数据了?select 成功了,对这个socket没有什么影响,只是表明现在socket可写了,也就表明刚才的connect成功了。同意sevencat(七猫)的说法
“那个设置超时的可以放到CONNECT后面吧,我想。”
setsockopt(sock,SOL_SOCKET,SO_SNDTIMEO, ...
setsockopt(sock,SOL_SOCKET,SO_RCVTIMEO, ...这两句是设置发送超时和接收超时,我认为最好放在判断connect成功之后,因为只有connect成功之后才可以谈数据的发送和接收的事
当然像你写的放在connect之前也没什么问题可以运行针对connect的超时 在那段代码里是用select判断的