知识点:
系统调用与C语言运行时库的区别:
一、概念
系统调用:运行在用户空间的应用程序向操作系统内核请求某些服务的调用过程,系统调用为用户程序与操作系统提供了接口,系统调用一般都在系统内核态执行,系统调用的移植差,因为他没有考虑平台的差异性;open,write,semget,semopt,
C语言运行时库:程序员们自己开发的,具有一些功能的函数集通过调用库(动态库,静态库)向程序员提供功能性的调用,他的可移植性好一点。printf,scanf,malloc
文件描述符就绪的条件,哪些条件下文件是可读的,可写,或者异常呢?
下列情况下socket可读:
(1)socket 的接受缓存区的字节数大于或等于低水位标志SO_RCVLOWAT,我们可以无阻塞的读此时的socket,并且读操作的返回为0;
(2)socket上有新的连接请求;
(3)当socket上有里的错误的时候,可以通过getsockopt来读取和清楚该错误;
下列情况socket可写:
(1)socket的发送缓存区的可用字节数大于或者等于他的低水位标志SO_SNDLOWAT,此时我们可以写数据;
(2)socket的写操作被关闭。对写操作关闭的socket执行写操作将会触发个SIGPIPE信号。
(3)当socket上有里的错误的时候,可以通过getsockopt来读取和清楚该错误;
(4)socket使用非阻塞的connect连接之后;
二、函数说明
有很多方法来获取和设置影响套接字的选项:
· getsockopt和setsockopt函数
· fcntl函数,是把套接字设置为非阻塞式I/O型或者信号驱动式I/O型以及设置套接字属主的POSIX的方式
· ioctl函数
这里只讨论getsockopt和setsockopt函数
GETSOCKOPT(2) Linux Programmer's Manual GETSOCKOPT(2)NAME
getsockopt, setsockopt - get and set options on sockets
SYNOPSIS
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
int getsockopt(int sockfd, int level, int optname,
void *optval, socklen_t *optlen);
int setsockopt(int sockfd, int level, int optname,
const void *optval, socklen_t optlen);
返回值:若成功返回0,若出错返回-1
参数说明:
其中sockfd必须指向一个打开的套接字描述符,level(级别)指定系统中解析选项的代码或为通用套接字代码,或为某个特定于协议的代码(例如IPv4、IPv6、TCP或SCTP)
optval是一个指向某个变量(*optval)的指针,setsockopt从*optval中取得选项代设置的新值,getsockopt则把已获取的选项当前值存放到*optval中。*optval的大小由最后一个参数指定。
else if(fds[i].revents & POLLERR)
89 {
90 printf("get an error from %d\n",fds[i].fd);
91 char errors[100];
92 memset(errors,'\0',100);
93 socklen_t length = sizeof(errors);
94 if(getsockopt(fds[i].fd,SOL_SOCKET,SO_ERROR,&errors,&length)< 0)
95 {
96 printf("get socket option failed\n");
97 }
98 continue;
99 }
///