一、套接字选项:

有以下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最大分段值
 
二、套接字通用选项示例
 
 
      协议无关是指这些选项是由内核中与协议无关的代码来处理的,而不是依赖于诸如IPv4等和具体IP协议相关的模块
 
 

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 网络编程 高级套接字的更多相关文章

  1. Linux网络编程——原始套接字实例:MAC 头部报文分析

    通过<Linux网络编程——原始套接字编程>得知,我们可以通过原始套接字以及 recvfrom( ) 可以获取链路层的数据包,那我们接收的链路层数据包到底长什么样的呢? 链路层封包格式 M ...

  2. Linux网络编程之套接字基础

    1.套接字的基本结构 struct sockaddr 这个结构用来存储套接字地址. 数据定义: struct sockaddr { unsigned short sa_family; /* addre ...

  3. Linux网络编程——原始套接字编程

    原始套接字编程和之前的 UDP 编程差不多,无非就是创建一个套接字后,通过这个套接字接收数据或者发送数据.区别在于,原始套接字可以自行组装数据包(伪装本地 IP,本地 MAC),可以接收本机网卡上所有 ...

  4. Linux网络编程——原始套接字能干什么?

    通常情况下程序员接所接触到的套接字(Socket)为两类: (1)流式套接字(SOCK_STREAM):一种面向连接的 Socket,针对于面向连接的TCP 服务应用: (2)数据报式套接字(SOCK ...

  5. LINUX 网络编程 原始套接字

    一 原始套接字 原始套接字(SOCK_RAW)是一种不同于SOCK_STREAM.SOCK_DGRAM的套接字,它实现于系统核心.然而,原始套接字能做什么呢?首先来说,普通的套接字无法处理ICMP.I ...

  6. TCP/IP网络编程之网络编程和套接字

    网络编程和套接字 网络编程又称为套接字编程,就是编写一段程序,使得两台连网的计算机彼此之间可以交换数据.那么,这两台计算机用什么传输数据呢?首先,需要物理连接,将一台台独立的计算机通过物理线路连接在一 ...

  7. 【TCP/IP网络编程】:01理解网络编程和套接字

    1.网络编程和套接字 网络编程与C语言中的printf函数和scanf函数以及文件的输入输出类似,本质上也是一种基于I/O的编程方法.之所以这么说,是因为网络编程大多是基于套接字(socket,网络数 ...

  8. UNIX网络编程——原始套接字(dos攻击)

    原始套接字(SOCK_RAW).应用原始套接字,我们可以编写出由TCP和UDP套接字不能够实现的功能. 注意原始套接字只能够由有 root权限的人创建. 可以参考前面的博客<<UNIX网络 ...

  9. UNIX网络编程——原始套接字的魔力【续】

    如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...

随机推荐

  1. Apache加载PHP.ini顺序

    网上找到一份关于Apache加载PHP.ini顺序的文档: (1) apache的httpd.conf中的PhpIniDir: (2) 注册表键值:HKEY_LOCAL_MACHINE->SOF ...

  2. JS URL编码

    JS URL编码escape() 方法: 采用ISO Latin字符集对指定的字符串进行编码.所有的空格符.标点符号.特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在 ...

  3. the server responded with a status of 404 (Not Found)

    1.出现这种问题,第一时间检查文件路径是否正确,相对路径或者绝对路径是否正确 2.某些后缀的文件是否能够找到,我现在碰到的就是.md文件找不到,需要配置web.config <system.we ...

  4. HTTP长连接(Comet)实现方式示例

    昨天看了comet的介绍后,虽然大概知道了comet的原理,不过没实际用过还是不太清楚,于是今天又在网上翻了一下别的网友共享的comet实现http长连接的例子,在 Comet Server Push ...

  5. python GUI模块的转变

    Tkinter → tkintertkMessageBox → tkinter.messageboxtkColorChooser → tkinter.colorchoosertkFileDialog ...

  6. 求相同号码一天内的上网流量——mapreduce

    上网数据 1363157985066 13726230503 00-FD-07-A4-72-B8:CMCC 120.196.100.82 i02.c.aliimg.com 24 27 2481 246 ...

  7. python在linux上的GUI无法弹出界面

    在进行python写GUI程序的时候,使用Tkinter,发现无法执行程序,报错如下: X connection to localhost:10.0 broken(explicit kill or s ...

  8. mysql create table - data_type length -- clwu

    mysql create table 时,有时需要指定  data_type length http://dev.mysql.com/doc/refman/5.5/en/create-table.ht ...

  9. 关于ES6扩展属性

    ES6 let和const let命令 只在代码块作用域内有效 不存在变量提升(不能在申明之前赋值) 暂时性死区(在区域内不受外部变量影响) 不允许重复申明(在相同代码块区域内) 块级作用域 let为 ...

  10. VMWare高可用集群在企业的应用

    650) this.width=650;" border="0" src="http://img1.51cto.com/attachment/201011/21 ...