一、套接字选项:

有以下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. ubuntu eclipse 安装svn

    1.helper->install new software 在弹出的窗口中work with 输入http://subclipse.tigris.org/update_1.6.x 2.下面窗口 ...

  2. xampp 提示 This setting can be configured in the file "httpd-xampp.conf".

    错误提示如下: New XAMPP security concept: Access to the requested object is only available from the local ...

  3. TestNG中同一个类中执行多个test()方法如何配置testng.xml

    public class IndexInfo extends BaseTesting{ private IndexPage IndexPage1;// private AddEquipmentInfo ...

  4. Selenium IDE- 不同的浏览器

    Selenium IDE- 不同的浏览器 Selenium IDE脚本只能对火狐的工具Firefox插件运行测试.使用Selenium-IDE开发的测试可以对其他浏览器所保存为Selenium网络驱动 ...

  5. Real Boxing 2

    http://itunes.apple.com/ca/app/real-boxing-2/id932779605?mt=8&ign-mpt=uo%3D4

  6. 虚幻4以及DX12将允许开发者利用Xbox One的更多性能(转)

    GamingBolt 最近采访了 Epic Games 的总经理 Ray Davis,讨论了有关旗下虚幻引擎(Unreal Engine)的议题.在这次的访谈中,Ray 解释了关于使用 DirectX ...

  7. MVC的路由

    MVC的路由包括以下几部分 路由名称,路由URL,路由的初始值,路由的约束,路由的命名空间 routes.MapRoute( name: "Default", url: " ...

  8. WARNING: Could not open/create prefs root node Software\JavaSoft\Prefs at root 0x80000002. Windows RegCreateKeyEx(...) returned error code 5

    以下是我的程序(取自headfirst Java): import javax.sound.midi.*; public class MiniMiniMusicApp { public static ...

  9. WinForm 根据屏幕分辨率自适应

    方法来自百度, 不算太好,但目前能满足需求.(窗口在LOAD的时候记录每个控件的坐标,每次窗口重绘的时候引时SizeChange事件,根据比率重新设置坐标) 以下是代码  AutoSizeFormCl ...

  10. vmware下ubuntu14.04调整分辨率

    很多人在vmware中安装ubuntu时,为了调整屏幕分辨率,都去下载并安装vmware-tools.其实,这是没有必要的.如果你需要vmware和宿主机实现共享,或者为了使文件能拖进拖出,再或者是需 ...