UNIX网络编程笔记 第七章 套接字选项
来源:互联网 发布:上海网页美工培训班 编辑:程序博客网 时间:2024/04/30 10:43
- getsockopt和setsockopt函数:
#include <sys/socket.h>int getsockopt(int fd, int level, int optname, void *optval, socklen_t *optlen);int setsockopt(int fd,int level, int optname,const void *optval, socklen_t option);//若成功均返回0,若失败返回-1/*level |optname |description----------------------|-----------------------|--------SOL_SOCKET SO_BROADCAST SO_DEBUG SO_DONTROUTE SO_ERROR SO_KEEPALIVE SO_LINGER SO_OOBINLINE SO_RCVBUF SO_SNDBUF SO_RCVLOWAT SO_SNDLOWAT SO_RCVTIMEO SO_SNDTIMEO SO_REUSEADDR SO_REUSEPORT SO_TYPE SO_USELOOPBACKIPPROTO_IP IP_HDRINCL IP_OPTIONS IP_RECVDSTADDR IP_RECVIF IP_TOS IP_TTL IP_MULTICAST_IF IP_MULTICAST_TTL IP_MULTICAST_LOOP IP_ADDR_MEMBERSHIP IP_DROP_MEMBERSHIP IP_BLOCK_SOURCE IP_UNBLOCK_SOURCE IP_ADDR_SOURCE_MEMBERSHIP IP_DROP_SOURCE_MEMBERSHIPIPPROTO_ICMPV6 ICMP6_FILTERIPPROTO_IPV6 IPV6_CHECKSUM IPV6_DONTFRAG IPV6_NEXTHOP IPV6_PATHMTU . . . . . .IPPROTO_IP/IPPROTO_IPV6 MCAST_JOIN_GROUP MCAST_LEAVE_GROUP MCAST_BLOCK_SOURCE MCAST_UNBLOCK_SOURCE MCAST_JOIN_SOURCE_GROUP MCAST_LEAVE_SOURCE_GROUPIPPROTO_TCP TCP_MAXSEG TCP_NODELAYIPPROTO_SCTP SCTP_ADAPTION_LAYER . . . . . . */
- SO_RECVBUF/SO_SNDBUF:
每一个套接字都有一个接收缓冲区和一个发送缓冲区(udp的发送缓冲区实际并不存在,它只是一个大小限制而已)。
接收缓冲区被tcp、udp、sctp用来保存接收到的数据,直到应用进程来读取。对于tcp来说,套接字接收缓冲区中可用空间的大小限定了tcp的窗口大小。tcp套接字缓冲区不可能溢出,因为不允许对端发出超过本端窗口限制大小的数据。然而对于udp来说,当接收到的数据包装不进套接字接收缓冲区时,就会被丢弃,udp没有流量控制。
当设置接收缓冲区大小时,函数调用顺序很重要。因为tcp窗口规模是在建立连接的syn报文中交互的,所以对于客户端来说,应该在connect之前设置SO_RCVBUF,对于服务器来说,应该在listen之前设置该值。
- SO_RCVLOWAT/SO_SNDLOWAT:
每个套接字都有这两个低水位标志,它们由select函数使用。
SO_RCVLOWAT指定接收缓冲区中至少有多少数据时,才可读。
SO_SNDLOWAT指定发送缓冲区有多少可用空间时,才可写。
因为udp发送缓冲区的可用字节数从不改变(udp并不为已发送数据包里副本),所以只要udp发送缓冲区大小大于该标志为,那么该套接字就总是可写的。- fcntl函数:
- fcntl代表file control,可控制各种描述符。
下面是 fcntl与ioctl、路由套接字对比:
//fcntl#include <fcntl.h>int fcntl(int fd, int cmd,.../*arg*/);//成功取决于cmd,出错返回-1//设置非阻塞int flags;if((flags = fcntl(fd,F_GETFL,0) < 0){ err_sys("F_GETFL error");}flags |= O_NONBLOCK;if(fcntl(fd,F_SETFL,flags) < 0){ err_sys("F_SETFL error");}//关闭非阻塞int flagsif((flags = fcntl(fd,F_GETFL,0) < 0){ err_sys("F_GETFL error");}flags &= ~O_NONBLOCK;if(fcntl(fd,F_SETFL,flags) < 0){ err_sys("F_SETFL error");}
0 0
- UNIX网络编程笔记 第七章 套接字选项
- 《UNIX网络编程卷1》读书笔记--第七章套接字选项
- 《UNIX网络编程》笔记——套接字选项
- 《unix网络编程》套接字选项
- UNIX网络编程 TCP套接字选项
- Unix网络编程代码 第7章 套接字选项
- UNIX网络编程卷一 笔记 第7章 套接字选项
- Unix网络编程学习笔记之第7章 套接字选项
- UNIX网络编程卷1:套接字联网-第7章:套接字选项
- UNIX网络编程笔记 第三章 套接字编程简介
- UNIX网络编程——套接字选项(SO_REUSEADDR)
- UNIX网络编程——套接字选项(setsockopt)
- UNIX网络编程——通用套接字选项
- 《unix网络编程》(17)套接字选项
- 第七章 套接字选项
- 网络编程--套接字选项
- UNP学习笔记(第七章 套接字选项)
- UNP学习笔记(第七章 套接字选项)
- 微服务架构设计 第四步: 分析微服务架构依赖与风险; 开发微服务最关键的一步
- 按字节截取字符串
- JAVA温习课堂3
- Linux/Window下socket
- 进程间通信笔记(4)—SystemV 消息队列
- UNIX网络编程笔记 第七章 套接字选项
- 使用cairo绘制图形的部分函数总结
- objc runtime
- 设计模式
- Rsync
- Use snippets in vim
- React-Native初体验一(window环境下开发)
- 华信9月11日上课心得
- 使用FireFox插件RESTClient、HttpRequester模拟http(get post)请求