UNIX环境高级编程——TCP/IP网络编程
副标题[/!--empirenews.page--]
常用网络信息检索函数 gethostname() getppername() getsockname() gethostbyname() gethostbyaddr() getprotobyname() getprotobynumber() getservbyname() getservbyport() 网络属性设置 头文件: #include <sys/types.h> #include <sys/socket.h> 获取一个套接口选项 int getsockopt( int sockfd, int level, //选项定义的层次。支持的层次仅有SOL_SOCKET和IPPROTO_TCP和IPPROTO_IP int optname, //需获取的套接口选项。 void *optval, //指针,指向存放所获得选项值的缓冲区。 socklen_t *optlen //指针,指向optval缓冲区的长度值。 ); 返回值: 无错:返回0。 出错:返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。 注释: getsockopt()函数用于获取任意类型、任意状态套接口的选项当前值,并把结果存入optval。在不同协议层上存在选项,但往往是在最高的“套接口”层次上,设置选项影响套接口的操作,诸如操作的阻塞与否、包的选径方式、带外数据的传送等。被选中选项的值放在optval缓冲区中。optlen所指向的整形数在初始时包含缓冲区的长度,在调用返回时被置为实际值的长度。对SO_LINGER选项而言,相当于linger结构的大小,对其他选项来说,是一个整形数的大小。如果未进行setsockopt()调用,则getsockopt()返回系统缺省值。 设置套接口的选项 int setsockopt( int sockfd, //标识一个套接口的描述字。 int level, //选项定义的层次;目前仅支持SOL_SOCKET和IPPROTO_TCP层次。 int optname, //需设置的选项。 const void *optval, //指向存放选项值的缓冲区的指针。 socklen_t optlen //optval缓冲区长度。 ); 返回值: 无错:返回0。 出错:返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
注释: setsockopt()函数用于任意类型、任意状态套接口的设置选项值。尽管在不同协议层上存在选项,但本函数仅定义了最高的“套接口”层次上的选项。选项影响套接口的操作,诸如加急数据是否在普通数据流中接收,广播数据是否可以从套接口发送等等。有两种套接口的选项:一种是布尔型选项,允许或禁止一种特性;另一种是整形或结构选项。允许一个布尔型选项,则将optval指向非零整形数;禁止一个选项optval指向一个等于零的整形数。对于布尔型选项,optlen应等于sizeof(int);对其他选项,optval指向包含所需选项的整形数或结构,而optlen则为整形数或结构的长度。SO_LINGER选项用于控制下述情况的行动:套接口上有排队的待发送数据,且closesocket()调用已执行。 系统IO与服务器模型 在unix/linux下主要有四种I/O模型 阻塞I/O:(管道大小64K) 简单,效率低,最常用 读阻塞 read,readv,recv,recvfrom,recvmsg 缓冲区没可读数据 写阻塞 write,writev,send,sendmag 写缓冲区小于小于要写入数据的量(UDP例外,无缓冲区概念) 其他: accept,connect 非阻塞I/O: 可防止进程阻塞在I/O操作上 若请求的I/O不能马上完成,返回错误。 设置非阻塞需要用循环测试文件描述符是否有数据。(poling)比较耗费CPU资源。 实现:(使用fcntl( )函数) #include <unistd.h> #include <fcntl.h> int fcntl( int fd, //文件描述符 int cmd, //操作的命令 long arg //flock 结构指针 返回值 : 成功则返回0, 错误则返回-1,并设置errno. 例: struct flcok { short int l_type; short int l_whence; off_t l_start; off_t l_len; pid_t l_pid; } l_type 有三种状态: F_RDLCK 建立一个供读取用的锁定 F_WRLCK 建立一个供写入用的锁定 F_UNLCK 删除之前建立的锁定 l_whence 也有三种方式: SEEK_SET 以文件开头为锁定的起始位置。 SEEK_CUR 以目前文件读写位置为锁定的起始位置 SEEK_END 以文件结尾为锁定的起始位置。 I/O多路复用: 允许同时控制多个I/O 思想: 构造一张有关文件描述符的表; 调用一个函数,得到这些描述符中的一个已准备好进行I/O时返回; 返回时,告诉进程的哪个描述符已经准备好,并可以进行I/O. 信号驱动I/O: 异步通信模型 I/O多路复用并发服务器流程 #include <sys/time.h> #include <sys/types.h> int select ( int n, //所有监控的文件描述符的集合 fd_set *readfds,// 所有要读的文件描述符的集合 fd_set *writefds,//所有要写的文件描述符的集合 fd_set *exceptfds,//其他要向我们通知的文件描述符 struct timeval *timeout )//超时设置。 timeout可选参数:NULL:一直阻塞,直到文件描述符就绪或出错,0:仅仅检测文件描述符集的状态,然后立即返回,非0:在指定时间内,若没事发生,则超时返回。 在我们调用select时进程会一直阻塞到有文件可以读或有文件可以写或超时所设置的时间到。 查看本栏目更多精彩内容:http://www.bianceng.cn/OS/unix/ (编辑:应用网_丽江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |