一、套接字选项:

有以下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. 关于asp.net中页面事件加载的先后顺序

    一.ASP.NET 母版页和内容页中的事件 母版页和内容页都可以包含控件的事件处理程序.对于控件而言,事件是在本地处理的,即内容页中的控件在内容页中引发事件,母版页中的控件在母版页中引发事件.控件事件 ...

  2. Textbox像百度一下实现下拉显示 z

    List<string> Data = new List<string>(); string Randomstr = "功夫撒黑胡椒hcbvf蜂窝qwertyuiop ...

  3. TextView------文字底部或者中间加横线

    promotionLinkText = (TextView) this .findViewById(R.id. text_promotion_link ); 中间加横线 promotionLinkTe ...

  4. IOS AutoLayout 遍历修改约束

    self.cvv2View.hidden = YES; self.periodView.hidden = YES; [self.contentView.constraints enumerateObj ...

  5. cookie跨域,跨目录访问及单点登录。

    首先普及下域名的知识: 域名: baidu.com    // 一级域名  A play.baidu.com  //  二级域名 B abc.play.baidu.com // 三级域名  C 数有几 ...

  6. 一个DataTable赋值给另一个DataTable的常用方法

    DataView view = new DataView();view.Table = DataTableA;view.RowFilter = "itemType = 'book'" ...

  7. IOS设备启动图像命名规范

  8. STL六大组件之——适配器代表大会

    适配器也是一种常用的设计模式: 将一个类的接口转换为另一个类的接口,使得原本因接口不兼容而不能合作的两个类可以一起运作.STL提供三种适配器:改变容器接口的容器适配器.改变迭代器接口的迭代器适配器以及 ...

  9. 记录一下ORACLE 10gR2的软件下载地址,备用。

    转载自:http://www.eygle.com/archives/2008/06/10gr2_download_link.html 记录一下ORACLE 10gR2的软件下载地址,备用. 下载OTN ...

  10. Winsock IO模型之select模型

    之所以称其为select模型是因为它主要是使用select函数来管理I/O的.这个模型的设计源于UNIX系统,目的是允许那些想要避免在套接字调用上阻塞的应用程序有能力管理多个套接字. int sele ...