Chinaunix首页 | 论坛 | 博客
  • 博客访问: 424803
  • 博文数量: 47
  • 博客积分: 1669
  • 博客等级: 上尉
  • 技术积分: 585
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-04 23:27
文章分类

全部博文(47)

文章存档

2011年(23)

2010年(24)

分类: LINUX

2010-09-28 16:55:21

14.shutdown函数

#include

int shutdown(int sockfd, int howto);

返回:0—成功,-1—失败。

 

函数的行为依赖于参数howto的值:

·  SHUT_RD:关闭连接的读这一半,不再接收套接口中的数据且留在套接口缓冲区中的数据都作废。进程不能再对套接口任何读函数。调用此函数后,由TCP套接口接收的任何数据都被确认,但数据本身被扔掉。

·  SHUT_WR:关闭连接的写这一半,在TCP场合下,这称为半关闭。当前留在套接口发送缓冲区中的数据都被发送,后跟正常的TCP连接终止序列。此半关闭不管套接口描述字的访问计数是否大于0。进程不能再执行对套接口的任何写函数。

SHUT_RDWR:连接的读这一半和写这一半都关闭。这等效于调用shutdown两次:第一次调用时用SHUT_RD,第二次调用时用SHUT_WR


15.pselect函数

#include

#include

#include

int pselect(int maxfdp1, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timespec *timeout, const sigset_t *sigmask);

返回:准备好描述字的个数,0—超时,-1—出错。

 

pselectPosix.1g发明的。相对select的变化:

1.   pselect使用结构timespec

2.   struct timespec {

          time_t tv_sec; /* seconds */

long tv_nsec; /* nanoseconds */

};

新结构中的tv_nsec规定纳秒数。

3.   pselect增加了第六个参数:指向信号掩码的指针。允许程序禁止递交某些信号。


16.poll函数

#include

int poll(struct pollfd *fdarray, unsigned long nfds, int timeout);

返回:准备好描述字的个数,0—超时,-1—出错。

 

第一个参数是指向一个结构数组的第一个元素的指针,每个数组元素都是一个pollfd结构:

struct pollfd {

int fd; /* descriptor to check */

    short events; /* events of interest on fd */

    short revents; /* events that occurred on fd */

};

要测试的条件由成员events规定,函数在相应的revents成员中返回描述字的状态(一个描述字有两个变量:一个为调用值,一个为结果)。

第二个参数指定数组中元素的个数。

第三个参数timeout指定函数返回前等待多长时间,单位是毫秒。可能值如下:

·  INFTIM,永远等待;

·  0,立即返回,不阻塞;

·  >0,等待指定数目的毫秒数。

标志的范围:

常量

能作为events的输入吗?

能作为revents的结果吗?

解释

POLLIN

yes

yes

普通或优先级带数据可读

POLLRDNORM

yes

yes

普通数据可读

POLLRDBAND

yes

yes

优先级带数据可读

POLLPRI

yes

yes

高优先级数据可读

POLLOUT

yes

yes

普通或优先级带数据可写

POLLWRNORM

yes

yes

普通数据可写

POLLWRBAND

yes

yes

优先级带数据可写

POLLERR

 

yes

发生错误

POLLHUP

 

yes

发生挂起

POLLNVAL

 

yes

描述字不是一个打开的文件

图可分为三部分:处理输入的四个常值;处理输出的三个常值;处理错误的三个常值。

 

poll识别三个类别的数据:普通(normal)、优先级带(priority band)、高优先级(high priority)。术语来自流的概念。

返回条件:

·  所有正规TCP数据和UDP数据都被认为是普通数据;

·  TCP的带外数据被认为是优先级带数据;

·  TCP连接的读这一半关闭时(如接收了一个FIN),这也认为是普通数据,且后续的读操作将返回0

·  TCP连接存在错误既可以认为是普通数据,也可以认为是错误(POLLERR)。无论哪种情况,后续的读操作将返回-1,并将errno置为适当的值,这就处理了诸如接收到RST或超时等条件;

·  在监听套接口上新连接的可用性既可认为是普通数据,也可以认为是优先级带数据,大多数实现都将其作为普通数据考虑。

·  如果不关心某个特定的描述字,可将其pollfd结构的fd成员置为一个负值,这样就可以忽略成员events,且返回时将成员revents的值置为0

poll没有select存在的最大描述字数目问题。但可移植性select要好于poll


17.getsockoptsetsockopt

#include
int getsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname, void *optval, socklen_t *optlen);
返回:0—OK-1—出错。

 

sockfd必须是一个打开的套接口描述字level(级别)指定系统中解释选项的代码:普通套接口代码或特定于协议的代码);optval是一个指向变量的指针;此变量的大小由最后一个参数决定。

对于某些套接口选项,什么时候进行设置或获取是有差别的。下面的套接口选项是由TCP已连接套接口从监听套接口继承来的:

·  SO_DEBUG

·  SO_DONTROUTE

·  SO_KEEPALIVE

·  SO_LINGER

·  SO_OOBINLINE

·  SO_RCVBUF

·  SO_SNDBUF

如果想在三路握手完成时确保这些套接口选项中的某一个是给已连接套接口设置的,我们必须先给监听套接口设置此选项。

 

原文:http://www.cnblogs.com/riky/archive/2006/11/24/570713.aspx

阅读(1058) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

chinaunix网友2010-09-29 11:39:53

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com