上次问过一次,是connect 函数有没有阻塞的问题, 答案是 tcp 连接的时候有连接如下
http://community.csdn.net/Expert/topic/3446/3446216.xml?temp=.5350611 我又参考了一篇文章: Socket中如何设置连接超时
作者:AntGhazi
http://dev.csdn.net/article/11/11620.shtm
作者的意思是: 先把socket设为非阻塞, 然后connect ,此时connect 会马上返回, 然后在后面 使用select 函数 ,具体的等待就是由此函数来完成的
我现在的问题是:
在tcp连接的 client端, 创建socket后, 由于默认是阻塞socket, 所以 紧接着 用connect 函数 ,如果server端没开的话, connect 函数 不应该返回, 因为这是阻塞的socket, 但事实表明 connect 在几秒后也返回了,也就是说,阻塞的socket 对 connect函数 并不阻塞,这是怎么回事???
小猪在回答上个问题的时候说: 阻塞的socket有个默认的连接超时,超过时间连接不上就会返回了,
这个默认的连接超时是可以设置的。 那么 这个 阻塞的 连接超时 应该在什么时候设置呢? 你给的代码如下 struct timeval timeout ;
fd_set r; FD_ZERO(&r);
FD_SET(cClient, &r);
timeout.tv_sec = 15; //连接超时15秒
timeout.tv_usec =0;
select(0, 0, &r, 0, &timeout); 因为当时 select 函数不理解,所以迟迟没有提出问题,现在看来
select 函数 是 配合非阻塞的 socket ,用来不断查询 socket的状态,
上面的代码 用在 非阻塞的 socket 中 是可以达到等待一定时间目的,
可是 用在阻塞的socket中 好像对 connect 函数并没有影响
请大家看看 ,谢谢
阻塞模式下并不存在什么“默认的连接超时”,server没开,connect隔一段时间的确会返回,但不是因为连接超时,而是因为发生错误,你可以通过检查返回值得到证明。
我的问题 简单说就是:tcp 连接中, 阻塞 socket 当使用conncet函数时 没连接上 为什么返回了? 根据 danyueer(淡月儿:清水上的足音) 的 回答, 做了个实验: tcp 连接
server端不存在, 在 client 端 创建一个阻塞的socket,然后用connect 函数连接, connect 函数返回后,用 WSAGetLastError 得到错误代码为: WSAECONNREFUSED WSAECONNREFUSED : the attempt to connect was forcefully rejected. 看来socket虽然是阻塞的 ,connect 函数 仍然被强行返回了
碰到问题,我的socket肯定是阻塞的,可是在接收(recv)的时候会返回10035错误,很奇怪。
首先我们假设connect函数的超时时间不能设定,那么好,如你所说connect函数连接肯定会发生错误,错误代码为 WSAECONNREFUSED,在我的 Windows Server 2003 Datacenter上这个时间是3秒(不同的系统确实存在差别),我们姑且可以称这个时间为“超时时间”。 第二次重新connect,时间一样是3秒。 然后再在connect函数前面加上如下这段代码,设置connect的超时时间为 struct timeval timeout ;
fd_set r; FD_ZERO(&r);
FD_SET(cClient, &r);
timeout.tv_sec = 15; //连接超时15秒
timeout.tv_usec =0;
select(0, 0, &r, 0, &timeout); 然后再用connect做连接的时候,会发现直到15秒的时候connect函数才会返回,同样返回WSAECONNREFUSED 同样设置为 20秒的时候是20秒才会返回。 请问你做合解释呢?仅仅是巧合吗?^_^
简单说,假如你设置了15秒的超时,那么系统这样理解:15秒以内Server都有可能出现,因此必须等待满超时,或者接到连接,函数才会返回。这是底层机制所决定的。
至于故障判断时间,每一个系统各不相同,但是返回的绝对不是TIMEOUT。
叫我的ID就好啦
不用提什么MM,姐姐的我只是一个ID