一、套接字选项:

有以下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. python基础之使用os.system来执行系统命令

    今天我们来尝试使用python 的os.system来执行系统命令 可以使用如下方法: import osprint os.system('ping www.baidu.com') 输出的结果是:64 ...

  2. SQLSERVER 检查字段值域并输出行数和值列表

    select * from ( SELECT 'C_DILEI' as fen,'地类' as fcn, 'NVARCHAR'as ftype, '2'as flen, ( SELECT count( ...

  3. 服务器中判断客户端socket断开连接的方法

    1, 如果服务端的Socket比客户端的Socket先关闭,会导致客户端出现TIME_WAIT状态,占用系统资源. 所以,必须等客户端先关闭Socket后,服务器端再关闭Socket才能避免TIME_ ...

  4. Linux makefile教程之书写规则三[转]

    书写规则———— 规则包含两个部分,一个是依赖关系,一个是生成目标的方法.在 Makefile中,规则的顺序是很重要的,因为,Makefile中只应该有一个最终目标,其它的目标都是被这个目标所连带出来 ...

  5. 利用COPYDATASTRUCT传递命令行参数给驻留内存的进程(SendMessage应用)

    我们知道Window进程之间通过API的SendMessage方法传递消息.但是方法参数lParam是Long型,那么如果传递一个字符串(譬如命令行参数)应该怎么办呢,甚至一个对象.结构呢.VB的发送 ...

  6. 简单地Android中图片的三级缓存机制

    我们不能每次加载图片的时候都让用户从网络上下载,这样不仅浪费流量又会影响用户体验,所以Android中引入了图片的缓存这一操作机制. 原理: 首先根据图片的网络地址在网络上下载图片,将图片先缓存到内存 ...

  7. 【转】CentOS 6.3 X64自动安装OpenERP 7.0脚本

    原文地址:OpenERP 7.0安装与配置 #!/bin/bash -e # Modified script from Carlos E. Fonseca Zorrilla # . Add the t ...

  8. C# 一个简单的秒表引发的窗体卡死问题

    一个秒表程序也是我的一个心病,因为一直想写这样的一个东西,但是总往GUI那边想,所以就比较怵,可能是上学的时候学MFC搞出的后遗症吧,不过当我今天想好用Win Form(话说还是第一次写win for ...

  9. 插入排序 --- 排序算法 --- 算法 --- java

    设数组为a[0…n-1]. 1.      初始时,a[0]自成1个有序区,无序区为a[1..n-1].令i=1 2.      将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间 ...

  10. cocos2dx 内存管理的理解

    关于引擎内存管理的细节,网上有大量的详解,这里概括一下: cocos2d-x 的世界是基于 CCObject 类构建的,所以内存管理的本质就是管理一个个 CCObject. //CCObject 内部 ...