荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: everlove.bbs@bbs.shuoshuo.net (我是如此厌倦), 信区: Linux
标  题: unp第十五章学习体会
发信站: 寂寞森林 (Mon Sep 23 10:49:23 2002)
转信站: SZUBBS!news2.happynet.org!news.happynet.org!LonelyWood


发信人: clown (梧桐叶), 信区: UNP
标  题: unp第十五章学习体会
发信站: UNIX编程 (2001年09月24日21:33:53 星期一), 站内信件

本章介绍socket中的非阻塞I/O,函数fcntl相信大家
也很熟悉了。书中主要介绍了非阻塞connect和非阻
塞accept.

1)非阻塞connect

为什么要使用非阻塞connect,觉得好处确实挺多:
1,可以在内核进行tcp三次握手的时候,让程序作其
他的事情。
2,可以同时建立多个连接。Netsape的浏览器中就使用
了这种技术。
3,可以设置connect的超时事件。
使用非阻塞connect时,内核继续进行tcp连接,但是程序
中该函数马上返回,因此有一个问题,怎样在程序中知道
连接建立成功了?这有一个与select相关的规则:
当连接成功建立时,套接口描述子变为可写;当连接建立
出错时,描述子变为既可读又可写。


在具体实现时,都是在select返回以后,使用getsockopt
中的SO_ERROR来确定建立连接到底是成功还是失败,不过
这个函数的返回值与具体的系统实现有关。

后面有一个非阻塞connect的例子。


2)非阻塞accept
考虑这样一种特殊的情况:客户向服务器建立连接,成功以后
马上就放弃(调用setsockopt中的SO_LINGER),这样服务器的
select返回可读,但是服务器在过一段时间后再调用accept(例如服务器
很忙),因此在从select返回和调用accept之间服务器收到了
客户发送的RST,这样该连接就会被内核删除,当调用accept的
时候就会阻塞在accept函数中(直到下一个连接到来),如果
select中同时有多个描述字可读,但是其它的描述字不是监听
描述子而是已连接的描述字,那么就会因为accept的阻塞而阻
塞,因此应该将accept设置为非阻塞的,这样就可以避免出现
这种情况。

后面也有一个这样的例子,可惜在Linux中不会在accept中阻塞。
不过在这个例子中,我发现select函数是一个被中断的系统调用,
也就是说在select函数阻塞的时候,如果进程受到某个信号,那么
select函数会被中断。


--
易朽的是生命,似那转瞬即谢的花朵;然而永存的,是对未来的渴望,
是那生生世世传递下来的,不朽的,生的激情。每一朵勇敢开放的花,
都是一个死亡唇边的微笑。
※ 修改:·clown 於 09月24日22:03:59 修改本文·[FROM: 211.69.205.23]
※ 来源:·UNIX编程 www.tiaozhan.com/unixbbs/·[FROM: 211.69.205.23]


--
我站在夜的尽头
窗外的雨悄悄坠落





※ 来源:.寂寞森林 http://bbs.shuoshuo.net  ◆ FROM: 211.161.158.231


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店