免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: jeanlove
打印 上一主题 下一主题

[C] 请教,我的select函数的timeval不起作用? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2009-05-13 10:02 |只看该作者
因为你的那个套接字根本就不可用,都没connect上

论坛徽章:
0
12 [报告]
发表于 2009-05-13 10:10 |只看该作者

回复 #9 jeanlove 的帖子

等待10秒,是说,没有数据过来,才会等待10秒,直到超时,
有数据过来,自然马上返回了,根本不会等。
小弟出个主意,楼主大大要是想看等待10秒的壮观景象 ^_^ 可以连一个不存在的ip
:wink:

评分

参与人数 1可用积分 +2 收起 理由
jeanlove + 2 我很赞同

查看全部评分

论坛徽章:
0
13 [报告]
发表于 2009-05-13 10:14 |只看该作者
原帖由 alexhappy 于 2009-5-13 10:02 发表
因为你的那个套接字根本就不可用,都没connect上


谢谢,你的意思是说:

connect上了,select等待服务器端发数据,设置超时,才会有用?

而在我的情况里面,因为根本没有服务器启动,所以select总是没用?

论坛徽章:
0
14 [报告]
发表于 2009-05-13 10:15 |只看该作者
原帖由 urapple 于 2009-5-13 10:10 发表
等待10秒,是说,没有数据过来,才会等待10秒,直到超时,
有数据过来,自然马上返回了,根本不会等。
小弟出个主意,楼主大大要是想看等待10秒的壮观景象 ^_^ 可以连一个不存在的ip
:wink:


问题是没有任何服务器在运行,我只是写了一个client端,看看select是否有等待的作用。

但是问题是,运行结果没有等待,立刻结束了。

为什么呢
kinwin 该用户已被删除
15 [报告]
发表于 2009-05-13 10:21 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
16 [报告]
发表于 2009-05-13 10:52 |只看该作者

回复 #14 kinwin 的帖子

楼上说的对!
tcp协议是这么规定的。
如果你连接一个存在的ip,但是这个ip的机器没有监听你要连接的端口,它会返回rst报文。(当然首先是你那个ip的机器支持tcp/ip协议,不过这点现在机器都支持)
你连不存在的ip试超时呀
楼主大大

评分

参与人数 1可用积分 +2 收起 理由
jeanlove + 2 我很赞同

查看全部评分

论坛徽章:
0
17 [报告]
发表于 2009-05-13 10:59 |只看该作者
原帖由 jeanlove 于 2009-5-13 10:15 发表


问题是没有任何服务器在运行,我只是写了一个client端,看看select是否有等待的作用。

但是问题是,运行结果没有等待,立刻结束了。

为什么呢

引用UNP:

Berkeley-derived implementations (and POSIX) have the following two rules regarding select and nonblocking connects:

When the connection completes successfully, the descriptor becomes writable (p. 531 of TCPv2).

When the connection establishment encounters an error, the descriptor becomes both readable and writable (p. 530 of TCPv2).


These two rules regarding select fall out from our rules in Section 6.3 about the conditions that make a descriptor ready. A TCP socket is writable if there is available space in the send buffer (which will always be the case for a connecting socket since we have not yet written anything to the socket) and the socket is connected (which occurs only when the three-way handshake completes). A pending error causes a socket to be both readable and writable.


翻译解释一下, 一个socket的发送缓冲如果未满, 则可写(对于一个连接中的socket, 总是可写的, 因为我们还未写入任何数据). 如果发生连接错误, 也会让socket可读和可写. 服务器没有启动, 所以肯定会发生连接错误, 这时, 连接已可读可写, select没有必要等待超时.

楼主可以看一下"UNP"这本书的16.4 Nonblocking connect: Daytime Client.  如果你想得到"尝试连接服务器, 最多尝试10秒"这个结果, 显然你不能仅仅通过select, 你应该维护你自己的计时器, 并在连接失败后手工重试(重新select), 并调整select的超时时间.

论坛徽章:
0
18 [报告]
发表于 2009-05-13 11:01 |只看该作者
原帖由 kinwin 于 2009-5-13 10:21 发表
前面说的很清楚了,因为select检测到描述符可读写。抓个包就看出来了。

10:19:45.381767 IP 127.0.0.1.43113 > 127.0.0.1.10080: Flags [S], seq 3647485351, win 32792, options [mss 16396,sackOK,TS val  ...


谢谢。
不过我的需求是: 客户端启动,看看能不能有本地的服务器能连通,连接等待10s钟,如果没有服务器就退出,有就读一点东西。

按照ls两位高人的说法,是不是:

如果根本没有服务器端运行,这个select就根本不等待,而是直接返回一个错误状态。
只有连上了,在等待IO的时候,select才是起作用的?

论坛徽章:
0
19 [报告]
发表于 2009-05-13 11:05 |只看该作者
如果根本没有服务器端运行,这个select就根本不等待,而是直接返回一个错误状态。

正是这样的.
只有连上了,在等待IO的时候,select才是起作用的?

不能随便地得出这种推论.

对于你的问题的解决方法: 检测到连接失败, 重新connect.

论坛徽章:
0
20 [报告]
发表于 2009-05-13 11:06 |只看该作者
原帖由 ideawu 于 2009-5-13 10:59 发表




翻译解释一下, 一个socket的发送缓冲如果未满, 则可写(对于一个连接中的socket, 总是可写的, 因为我们还未写入任何数据). 如果发生连接错误, 也会让socket可读和可写. 服务器没有启动, 所以肯定会发生连 ...


嗯,这个解释很强大
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP