Linux 网络编程 高级套接字
一、套接字选项:
有以下3中方式可以对套接字选项进行设置:
- getsockopt 和 setsockopt 函数
- fcntl函数
- ioctl函数
getsockopt和setsockopt函数用于获得和设置套接字的选项值,fcntl用来操作文件描述符的有关属性,比如设置套接字文件描述符工作于非阻塞模式等,而ioctl用于控制I/O设备。
套接字选项和协议层
| 协议层(Level) | 选项(optname) | 含义 |
| SOL_SOCKET (套接字通用选项) |
SO_KEEPALIVE O_RESUSEADDR SO_LINGER SO_SNDBUF SO_RCVBUF SO_TYPE SO_ERROR …… |
允许TCP链接保活检测 允许本地地址被重用 允许TCP连接保持一段时间知道数据发送完毕 套接字发送缓冲大小 套接字接收缓冲大小 获得套接字类型 获得套接字易发生的错误并清除 …. |
| SOL_TCP (TCP协议层选项) |
SO_NODELAY TCP_MAXSEG |
禁止TCP Nagle算法 TCP最大分段值 |
1、SO_KEEPALIVE
当对TCP套接字设置了保活选项后,若在两小时内TCP连接双方没有发送过任何数据,则设置了该选项方TCP将自动向对方发送保活探测分段,并且接收方TCP必须应答此分段。
虽然客户端也可以使用该选项,但是该选项通常是由服务器使用,因为服务器往往总是处于阻塞状态,并等待客户端发来的请求,所以如
果一个客户端由于关机或者待机等原因而断开和服务器建立的链接后,服务器进程就无法及时知道此情况,这将导致服务器一直为这些已经断开的连接继续分配宝贵的资源,保活选项可以检测出此情况。
下面是使用SO_KEEPALIVE 选项检测丢失连接的代码段:
#define TRUE 1
#define FALSE 0
int ret;
int sockfd;
int so_keepalive; so_keepalive = TRUE;
ret = setsockopt(sockfd,SOL_SOCKET,SO_KEEPALIVE,&so_keepalive,sizeof(so_keepalive));
2、SO_REUSEADDR
当结束一个已经成功建立了TCP连接的服务器的运行后,若立刻重新启动该服务器,则服务器不能再次绑定到完全相同的地址端口,根据TCP协议的规定,当服务器断开连接后,作为TCP连接的一个组成部分,该众所周知的端口将处于2MSL状态,需要经过1~4分钟后才能重新使用,为了尽快启动服务器重新监听,通过设置SO_REUSEADDR选项,可以让服务器立刻再次绑定到同一个端口…..
另外,使用SO_REUSEADDR 选项还需要注意下面两点:
- 没有其他的具有相同IP地址和端口的TCP套接字正处于监听状态;
- 所有具有相同IP地址和端口的套接字的SO_REUSADDR选项设置都必须设为真
下面是设置套接字SO_REUSEADDR 选项的代码片段:
#define TRUE 1
#define FALSE 0
int ret;
int sockfd;
int so_useaddr; so_useaddr = TRUE;
ret = setsockopt(sockfd,SOL_SOCKET,SO_REUSEADDR,&so_useaddr,sizeof(so_useaddr));
Linux 网络编程 高级套接字的更多相关文章
- Linux网络编程——原始套接字实例:MAC 头部报文分析
通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 M ...
- Linux网络编程之套接字基础
1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* addre ...
- Linux网络编程——原始套接字编程
原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...
- Linux网络编程——原始套接字能干什么?
通常情况下程序员接所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的 Socket,针对于面向连接的TCP 服务应用: (2)数据报式套接字(SOCK ...
- LINUX 网络编程 原始套接字
一 原始套接字 原始套接字(SOCK_RAW)是一种不同于SOCK_STREAM.SOCK_DGRAM的套接字,它实现于系统核心.然而,原始套接字能做什么呢?首先来说,普通的套接字无法处理ICMP.I ...
- TCP/IP网络编程之网络编程和套接字
网络编程和套接字 网络编程又称为套接字编程,就是编写一段程序,使得两台连网的计算机彼此之间可以交换数据.那么,这两台计算机用什么传输数据呢?首先,需要物理连接,将一台台独立的计算机通过物理线路连接在一 ...
- 【TCP/IP网络编程】:01理解网络编程和套接字
1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...
- UNIX网络编程——原始套接字(dos攻击)
原始套接字(SOCK_RAW).应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能. 注意原始套接字只能够由有 root权限的人创建. 可以参考前面的博客<<UNIX网络 ...
- UNIX网络编程——原始套接字的魔力【续】
如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...
随机推荐
- 经典排序算法(Java版)
1.冒泡排序 Bubble Sort 最简单的排序方法是冒泡排序方法.这种方法的基本思想是,将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮.在冒泡排序算法中我们要对这个“气泡” ...
- Fisher information matrix笔记
在看FK论文时,fisher information matrix是必须理解的. 从维基百科查阅到,Fisher information matrix是用利用最大似然函数估计来计算方差矩阵. 来源于: ...
- leetcode:ZigZag Conversion 曲线转换
Question: The string "PAYPALISHIRING" is written in a zigzag pattern on a given number of ...
- <System.ServiceModel>
實例: <system.serviceModel> <diagnostics performanceCounters="All" /> < ...
- [转]32位和64位系统区别及int字节数
一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会 ...
- CentOS 5.5 快速安装MariaDB-5.5.35
被网上各种教程坑的不轻T,T,5.5下不升级yum的情况下想快速安装还真有点费劲 至于源码编译安装坑貌似更多 而且在小内存的VPS上编译实在费力 下载地址 http://yum.mariadb.org ...
- proguard 混淆android代码
官网 http://proguard.sourceforge.net/#manual/examples.html android 2.3后,新建的project默认就有一个project.proper ...
- Jersey Rest服务类型
在Rest服务中,资源类是接收Rest请求并完成响应的核心类,而资源类由Rest服务的“提供者”来调度的,这一定义类似于自定义Servlet类,该类会奖请求分派给指定的Controller/Actio ...
- 轻松学Shell之认识正规表达式
离线下载观看:http://down.51cto.com/data/148117 650) this.width=650;" onclick='window.open("htt ...
- 加固Samba安全三法
欢迎大家给我投票: http://2010blog.51cto.com/350944 650) this.width=650;" onclick='window.open("htt ...