08套接字选项与原始套接字

合集下载

php ping()原理

php ping()原理

php ping()原理PHP的ping()函数是用来检测指定IP地址是否可达的函数。

它通过向目标IP地址发送ICMP请求包,并等待目标主机返回ICMP响应包来判断目标主机是否可达。

本文将介绍ping()函数的原理及其实现过程。

在网络通信中,ping命令被广泛用于测试主机之间的连通性。

在PHP中,通过调用系统命令来执行ping操作是一种常见的方法,但这种方法要求服务器上安装有ping命令,且只能在Linux环境下使用。

而PHP的ping()函数则是一种更加便捷和跨平台的实现方式。

在PHP中,ping()函数的实现原理是通过创建一个原始套接字来发送和接收ICMP数据包。

ICMP(Internet Control Message Protocol)是一种网络协议,用于在IP网络中传递错误和控制信息。

通过发送ICMP请求包,我们可以获取目标主机的响应信息,从而判断目标主机是否可达。

具体实现过程如下:1. 创建一个原始套接字在PHP中,我们可以使用socket_create()函数来创建一个原始套接字。

原始套接字可以让我们直接访问网络层的数据包,而不需要经过传输层或应用层的处理。

2. 设置套接字选项在创建套接字后,我们需要设置一些套接字选项。

其中包括设置套接字为ICMP协议,设置超时时间等。

3. 构造ICMP请求包ICMP请求包由IP头部和ICMP头部组成。

IP头部包含源IP地址、目标IP地址等信息,而ICMP头部则包含类型、代码、校验和等信息。

构造ICMP请求包时,我们需要设置目标IP地址和ICMP类型为ping请求。

4. 发送ICMP请求包使用socket_sendto()函数将构造好的ICMP请求包发送给目标主机。

其中,目标主机的IP地址可以是用户输入的参数,也可以是程序中预设的地址。

5. 接收ICMP响应包使用socket_recvfrom()函数接收目标主机的响应包。

如果目标主机可达,则会返回一个ICMP响应包;如果目标主机不可达,则会返回一个ICMP差错包。

AF_INET与套接字

AF_INET与套接字

AF_INET 与套接字创建套接字的函数是socket(),函数原型为:其中 “int domain”参数表⽰套接字要使⽤的协议簇,协议簇的在“linux/socket.h”⾥有详细定义,常⽤的协议簇:AF_UNIX(本机通信)AF_INET(TCP/IP-IPv4)AF_INET6(TCP/IP-IPv6)其中 “type”参数指的是套接字类型,常⽤的类型有:SOCK_STREAM (TCP 流)SOCK_DGRAM (UDP 数据报)SOCK_RAW (原始套接字)最后⼀个 “protocol”⼀般设置为“0”,也就是当确定套接字使⽤的协议簇和类型时,这个参数的值就为0,但是有时候创建原始套接字时,并不知道要使⽤的协议簇和类型,也就是domain 参数未知情况下,这时protocol 这个参数就起作⽤了,它可以确定协议的种类。

socket 是⼀个函数,那么它也有返回值,当套接字创建成功时,返回套接字,失败返回“-1”,错误代码则写⼊“errno”中。

创建套接字:python 中socket 默认为Ipv4,tcp 模式。

服务端listen 参数的问题可以表⽰可建⽴socket 连接的排队的个数windows ,mac 此连接参数有效Linux 此连接参数⽆效,默认最⼤客户端# socket 编程中主动关闭和被动关闭tcp 中server,client 都可能是主动关闭⽅或者被动关闭⽅,现阐述下两者之间的关系:客户端(client) 服务器(server)close() Fin x -> 读通道关闭(close_wait)写通道关闭 <- Ack x+1#include <sys/types.h>#include <sys/socket.h>int socket(int domain, int type, int protocol);sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.bind((ip,port))#绑定ip 和端⼝号sock.listen(5)#开启监听,允许5个连接,while True:conn,addr = sock.accept()buf = conn.recv(1024)if len(buf):print (buf) conn.send(buf)sock.close()sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.connect((ip,port))#监听ip 和端⼝号sock.send(messages)while True:buf = sock.recv(1024)#⼀次接受1024字节数据if len(buf):print (buf)sock.close()读通道关闭(time_wait) <- Fin y close()ack y+1 -> 写通道关闭2x msl closedclosed客户端调⽤函数close(),这时,客户端会发送⼀个FIN信号给服务器服务器收到FIN信号,关闭套接字的读通道,并将⾃⼰的状态设置为CLOSE_WAIT(表⽰被动关闭),并返回⼀个ACK给客户端客户端收到ACK,关闭套接字写通道接下来服务器会调⽤close():服务器close(),发送⼀个FIN到客户端。

CAN应用程序编写

CAN应用程序编写

4.1.1 原始套接字选项CAN_RAW_FILTERCAN_RAW套接字的接收可以使用CAN_RAW_FILTER套接字选项指定的多个过滤规则(过滤器)来过滤。

过滤规则(过滤器)的定义在include/linux/can.h中:struct can_filter {canid_t can_id;canid_t can_mask;};过滤规则的匹配:<received_can_id> & mask == can_id & mask/*#define CAN_INV_FILTER0x20000000U /* to be set in can_filter.can_id */ #define CAN_ERR_FLAG 0x20000000U /* error frame */*/这和大家所熟知的CAN控制器硬件过滤非常相似。

可以使用CAN_INV_FILTER这个宏将can_filter结构体的成员can_id中的比特位反转。

和CAN控制器的硬件过滤形成鲜明对比的是,用户可以为每一个打开的套接字设置多个独立的过滤规则(过滤器):/*/* valid bits in CAN ID for frame formats */#define CAN_SFF_MASK 0x000007FFU /* 标准帧格式(SFF) */#define CAN_EFF_MASK 0x1FFFFFFFU /* 扩展帧格式(EFF) */#define CAN_ERR_MASK 0x1FFFFFFFU /* 忽略EFF, RTR, ERR标志*/*/struct can_filter rfilter[2];rfilter[0].can_id = 0x123;rfilter[0].can_mask = CAN_SFF_MASK;rfilter[1].can_id = 0x200;rfilter[1].can_mask = 0x700;setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, &rfilter, sizeof(rfilter));为了在指定的CAN_RAW套接字上禁用接收过滤规则,可以这样:setsockopt(s, SOL_CAN_RAW, CAN_RAW_FILTER, NULL, 0);在一些极端情况下不需要读取数据,可以把过滤规则清零(所有成员设为0),这样原始套接字就会忽略接收到的CAN帧。

TCP协议中的TCP_NODELAY与TCP_CORK选项:使用与设置建议(一)

TCP协议中的TCP_NODELAY与TCP_CORK选项:使用与设置建议(一)

TCP协议中的TCP_NODELAY与TCP_CORK选项:使用与设置建议在计算机网络通信中,TCP协议是最常用的传输层协议之一。

它能够提供可靠的数据传输,保证数据的完整性和可达性。

然而,在实际应用中,我们经常需要对TCP协议进行一些调优,以提高网络传输的效率。

这篇文章将重点介绍TCP协议中的TCP_NODELAY与TCP_CORK选项,并给出使用和设置上的一些建议。

1. TCP_NODELAY选项TCP_NODELAY选项是TCP协议中的一个套接字选项,用于控制是否启用Nagle算法。

Nagle算法的作用是将多个小的TCP报文合并成一个大的TCP报文进行传输,从而减少报文的数量,提高网络传输效率。

默认情况下,TCP_NODELAY选项是关闭的,也就是启用了Nagle算法。

然而,有些应用场景下,我们需要及时地将数据发送出去,而不希望经过多余的延迟。

这时,就可以通过设置TCP_NODELAY选项来关闭Nagle算法,立即发送数据。

在某些实时性较高的应用中,如在线游戏、实时音视频传输等,关闭Nagle算法可以有效降低传输延迟,提升用户体验。

为了使用TCP_NODELAY选项,我们可以通过setsockopt函数来设置:```csetsockopt(socket, IPPROTO_TCP, TCP_NODELAY, (char*)&flag, sizeof(flag));```这里的socket是要设置的TCP连接的套接字描述符,flag为1表示启用TCP_NODELAY选项。

如果要禁用TCP_NODELAY选项,只需要将flag设为0即可。

需要注意的是,虽然关闭Nagle算法可以提高实时性,但也会增加网络负载。

因此,在一般的数据传输场景下,建议保持默认的Nagle 算法开启状态。

2. TCP_CORK选项TCP_CORK选项是在Linux系统上特有的一个套接字选项,用于控制是否启用Corking算法。

原始套接字网络嗅探器的实现与应用

原始套接字网络嗅探器的实现与应用

1 . 3 U D P协议结构
U D P 数 据段 头 比较 简单 .由一 个 8 字 节 的头和 数 据部 分 组成 具体 格式 如表 2 所示。
表2 U D P报 文 格 式
源端 口 ( 1 6 位 )I 目的端 口 ( 1 6位)
U D P长度 ( 1 6位 U D P校验和
#d e f i n e I P DAD DR
9 1 2
1 6
g e t h o s t n a me函数获取 本地 主机 的名称 。
( 2) g e t h O S t b Y n a m e( h O S t —n a m e
#d e f i n e H I — I C M P
G MP #d e f i n e H II
—Байду номын сангаас
#d e f i n e H I — T C P
D P #d e f i n e H IU

#d e f i n e HI — OS P F

1 . 4 T C P协议结构
2 . 3实现的具体 函数
( 1 )g e t h o s t n a me (h o s t _ n a me .s i z e o f ( h o s t _ n a me ))

#d e f i n e I P — H I T Y P E #d e f i n e I P — S A D D R
而T C P 数 据 头则 比较 复 杂 ,以 2 0个 固定 字 节开
始 在 固定头 后 面还可 以有一 些长 度不 固定 的可 选项
2 . 2具体实现
根 据 前文 提 到的把 网卡设 置成 混杂模 式 ,进 而实

第3章 Winsock基础

第3章 Winsock基础

第3章 WinSock基础 int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData);
此函数初始化Windows Sockets DLL,必须是应用程序或 DLL第一个调用的Windows Sockets函数允许.应用程序或 DLL指定Windows Sockets API要求的版本,以获取指定的 Windows Sockets实现的细节.应用程序或DLL只有在一次成 功的WSAStartup()执行后才能发布后续的WinSock函数.
第3章 WinSock基础 3.2.2 错误检查和控制
错误检查和控制对于WinSock应用程序是至关重要的.事 实上,对Windows Sockets API函数来说,返回错误是很常见 的,但多数情况下,通信仍可在套接字上进行.尽管返回的值 并非一成不变,但不成功的WinSock调用返回的最常见的值是 SOCKET_ERROR.SOCKET_ERROR是值为-1的常量.如果返回了 错误,可用WSAGetLastError函数来获得一段代码,这段代码 明确地表明了产生错误的原因.WSAGetLastError函数如下: int WSAAPI WSAGetLastError WSAGetLastError(void); 该函数的返回值指示当前线程最近执行的Windows Sockets API函数产生的错误.
第3章 WinSock基础 WinSock对Socket的扩充 3.1.5 WinSock对Socket的扩充 Windows Sockets API 是 windows 的 网 络 程 序 接 口 , 从 Berkeley Sockets扩展而来的,并在继承Berkeley Sockets的 基础上进行了新的扩充.这些扩充主要是提供了一些异步函数, 并增加了符合Windows消息驱动特性的网络事件异步选择机制.

基于原始套接字的网络安全研究与实现

维普资讯
第 2 卷 第 5 7 期
V0. 7 12
NO 5 .
计 算 机 工 程 与 设 计
Co u e n ie rn n sg mp trE g n eig a dDe in
20 年 3 06 月
M a .2 0 r 06
基于原始套接字的网络安全研究与实现
刘振 宪, 王 津涛, 侯 德, 朱 江
( 南开 大学 信 息学 院 ,天 津 3 0 7) 0 01
摘 要 : 围绕信 息的获取 、 用和控 制 的竞争愈 演愈烈 , 使 网络 安全 问题 变得 日益 重要 , 息安 全成 为维 护 国家安 全和社 会稳 信
定的 一个 焦点。如何 辨别 防御 与攻击 和增 强网络安 全 已成 为网络远 营商和技 术管理 人 员 、 至普 通 网络用 户研 究的 问题 。 甚 在 网络安 全方 面 , 用原始 套接 字 实现 网络 嗅探 可以有 效地探 测在 网络 上传 输的数 据 包信 息 , 这 些信息 的分析 有助 于 网 利 对
考 虑 的重 要 问题 之 一 。
Ab ta t Gan u ea dc nr l o e to e ovn ru difr t ni ice sn l e c . Newo ks c rt u sinc a g s sr c : i, s n o t mp tinrv ligao n omai sn ra igyf r e o c i n o i t r eu i q eto h n e y
络安全 的维护 .
关键词 : 网络安全 ; 套接 字;原始 套接 字 :嗅探 器; 黑客
中图法分类号:P9. T 33 8 0
文献标识码: A
文章编号:00 04 20) 5 78 3 10. 2 ( 60. 6. 7 0 0 0

socket_base

网络通信的基本概念
•1.1网络: 从通信的角度来说,网络就是在物理上或/和逻辑上,按 一定拓扑结构连接在一起的多个节点和链路的集合。在计 算机领域中,网络就是用物理链路将各个孤立的工作站或 主机相连在一起,组成数据链路,从而达到资源共享和通 信的目的 。
1
网络通信的基本概念
• 1.2 IP IP是英文Internet Protocol(网络之间互连的协议)的 缩写,简称为“网协”,就是为计算机网络相互连接进 行通信而设计的协议。在因特网中,它是能使连接到网 上的所有计算机网络实现相互通信的一套规则,规定了 计算机在因特网上进行通信时应当遵守的规则。任何厂 家生产的计算机系统,只要遵守 IP协议就可以与因特网 互连互通。IP地址具有唯一性,根据用户性质的不同, 可以分为5类。 A类保留给政府机构,B类分配给中等规模的公司,C 类分配给任何需要的人,D类用于组播,E类用于实验。
连接 connect() 收发数据 send()、recv() 关闭socket closesocket() Winsock解放 WSACleanup() client10servr常用socket Api
• socket
#include <winsock.h>
SOCKET PASCAL FAR socket( int af, int type, int protocol);
WSANOTINITIALISED:之前应首先成功地调用WSAStartup()。 WSAENETDOWN:WINDOWS套接口实现检测到网络子系统失效。 WSAEADDRINUSE:所定端口已在使用中(参见setoption()中的 SO_REUSEADDR选项)。 WSAEFAULT:namelen参数太小(小于sockaddr结构的大小)。 WSAEINPROGRESS:一个阻塞的WINDOWS套接口调用正在运行中。

网络应用程序设计(方敏)-第2章 基于TCP套接字的编程


struct sockaddr
{
unsigned short sa_family; AF_xxx */
/* 地址类型,
char
sa_data[14];
/* 协议地址 */ห้องสมุดไป่ตู้
};
第2章 基于TCP套接字的编程
其中: sa_family:保存协议标识符。 AF_INET:代表TCP/IP协议簇。 sa_data:保存具体的协议地址。
因此,socket是一个工具,或者说是一种不可见控件, 应用程序可以通过socket函数,来访问底层网络协议。
第2章 基于TCP套接字的编程
2.2.2 套接字地址
套接字接口利用传送提供者进行工作,不同的传送提供者 有不同的地址,套接字接口允许指定任意类型的地址。
Linux系统的套接字是一个通用的网络编程接口,它支持 多种协议,每一种协议使用不同的套接字地址结构。Linux系 统定义了一种通用的套接字地址结构,可以保持套接字函数调 用参数的一致性。如下所示:
描述符是指通信信道的末端。如果调用失败,则返回-1。其 中参数定义为:
● family:表示所用的协议是协议簇中的哪一个。协 议簇是有相同地址格式的一组传送提供者。例如,TCP和UDP 有同样的地址格式,因此它们属于同一协议簇。family的值 可以为:
第2章 基于TCP套接字的编程 AF_INET: TCP/IP协议集合。 AF_UNIX: UNIX域协议簇,在本机的进程间通信时使用。 AF_ISO: ISO协议簇。 ● type:表示套接字类型: sock_STREAM:提供虚电路服务的流套接字。 sock_DGRAM:提供数据报服务的套接字。 sock_RAW:原始套接字,只对Internet协议有效,可以

qt socketoption用法

qt socketoption用法在Qt中,`QAbstractSocket` 类提供了网络编程中的套接字(socket)功能,包括设置套接字选项的方法。

`QAbstractSocket` 是`QTcpSocket` 和`QUdpSocket` 的基类。

`setSocketOption` 方法用于设置套接字选项。

以下是一个简单的示例,演示了如何在`QTcpSocket` 中使用`setSocketOption` 设置套接字选项:```cpp#include <QTcpSocket>#include <QDebug>int main() {QTcpSocket socket;// 设置套接字选项,例如超时时间socket.setSocketOption(QAbstractSocket::SocketTimeoutOption, 5000); // 设置超时时间为5秒// 其他套接字选项设置// socket.setSocketOption(QAbstractSocket::SomeOption, someValue);// 打印设置的超时时间qDebug() << "Timeout option: " << socket.socketOption(QAbstractSocket::SocketTimeoutOption);return 0;}```在上面的例子中,我们设置了`SocketTimeoutOption`,即超时时间,为5秒。

你可以根据需要设置其他套接字选项,具体的选项可以查阅Qt 文档中`QAbstractSocket::SocketOption` 列表,以及相关的子类文档(例如`QTcpSocket` 或`QUdpSocket`)。

请注意,套接字选项的使用可能取决于具体的网络协议和操作系统。

在Qt 文档中,你可以找到有关每个选项的详细信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

套接口选项函数
1.函数格式
int getsockopt( SOCKET s, int level, int optname, const char FAR* optval, int FAR* optlen );
• 套接口选项设置函数setsockopt( )的格式如下: int setsockopt( SOCKET s, int level, int optname, char FAR* optval, int optlen );
• IP_HDRINCL:该选项可以获取,也可以设置。 • IP_MULTICAST_TTL:该选项可以获取,也可以设置。 • IP_MULTICAST_IF:该选项可以获取,也可以设置, IP_MULTICAST_IF 用于为IP多播设置一个本地接口,本地机器以后发出 的任何多播数据都会经由该接口传送出去。 • IP_MULTICAST_LOOP:该选项可以获取,也可以设 置。该选项用于控制发送的多播数据是否进入本地套 接口的输入数据队列中。
• SO_LINGER:该选项值可以获取,也可以设置。该选项不能使用在 SOCK_DGRAM类型的套接口上。它用于控制在closesocket( )函数已执 行的情况下,如何处理套接口数据排列上未发送完毕的数据。该选项要 通过linger结构来设置,该结构的定义如下: struct linger{ int l_onoff; int l_linger; }; • l_onoff字段用来控制SO_LINGER选项的打开或关闭,为了使该选项起 作用,该字段应该设置为一个非0的值。l_linger字段表示延迟时间,以 秒为单位。 • 当l_onoff和l_linger字段取不同的值时,系统的操作方式也不同。
2.函数参数说明
• setsockopt( )函数和getsockopt( )函数的参数是一样的, 但setsockopt( )函数的optval和optlen选项应该由应用程 序填写,而getsockopt( )函数的这两个选项是返回值, 由系统来填写。 • 函数中各参数的含义如下:
– s:传入参数,参数s指定一个有效的套接口,我们要对这个套 接口的选项进行操作。 – level:传入参数,套接口选项定义的级别(层次)。常用的级别 有SOL_SOCKET、IPPROTO_IP和IPPROTO_TCP
3.函数返回信息
• 若 函 数 调 用 时 无 错 误 发 生 , 则 setsockopt( ) 函 数 和 getsockopt( )函数都返回0。如果调用发生错误,则返 回 SOCKET_ERROR 错 误 信 息 , 应 用 程 序 可 通 过 WSAGetLastError( )函数获取对错误信息的进一步说明。 • 以下是错误代码的含义说明:
– WSANOTINITIALISED : 在 使 用 此 API 之 前 应 成 功 调 用 WSAStartup( )。 – WSAENETDOWN:Windows套接口实现已检测到网络子系统 失效。 – ……
SOL_SOCKET选项级别
• SOL_SOCKET选项级别主要针对传输层协议 (TCP或UDP)。在SOL_SOCKET选项级别下, 套接口的选项有两种类型:一种是值为布尔型 (BOOL)的选项,这种选项可以允许或禁止一 种 特 性 ; 另 一 种 是 值 为 整 型 (int) 或 结 构 型 (Struct Linger)的选项,这种选项可以用来设置 系统工作时的某些参数。
≠0
≠0
Hale Waihona Puke 设置因为它不会造成数据的丢失。请注意,如果套接口设置为非阻 塞模式且 SO_LINGER 设为非 0 的超时值, closesocket( )调用 则 将以 WSAEWOULDBLOCK 错误返回 调用 closesocket( )函数时,套接口的 TCP 连接被立即关闭, 套接口缓冲区中未发送的数据丢失, 因此这种关闭方式称为 “强
IPPROTO_IP选项级别
Optname(选项名) IP_HDRINCL IP_MULTICAST_TTL IP_MULTICAST_IF IP_MULTICAST_LOOP IP_ADD_MEMBERSHIP IP_DROP_MEMBERSHIP 数据类型 获取/设置 BOOL int int BOOL ip_mreq ip_mreq 获取/设置 获取/设置 获取/设置 获取/设置 设置 设置 说 明 如为 TRUE,则将 IP 头作为数据的一 部分放在数据前发送 用于多播数据的 TTL 设置 设置多播的一个本地接口地址 该选项用于控制发送的多播数据进入 本地套接口的输入数据队列中 把套接口加入指定的多播组中 把套接口从指定的多播组中删除
SO_REUSEADDR BOOL SO_RCVTIMEO SO_SNDBUF SO_SNDTIMEO int int int
• SO_BROADCAST: 可以获取也可以设置。如果指定 的套接口该选项已经设置为TRUE,则允许套接口广播 收发信息。该选项只有对非SOCK_STREAM类型的所 有套接口才是有效的。 • 广播使本地子网上的所有机器都能收到相同的数据。 缺点在于假如同时有许多进程发送广播数据,网络立 刻就会拥挤不堪,造成网络性能大大降低,甚至有可 能陷入瘫痪。 • 要想接收一条广播消息,首先必须启用广播选项,然 后 使 用 某 个 数 据 报 接 收 函 数 , 比 如 recvfrom( ) 或 WSARecvFrom( )。该选项的设置方法如下:
• IP_ADD_MEMBERSHIP:该选项只能设置。该选项实际是 由Winsock1提供的一个方法,可将一个套接口加入一个指 定的IP多播组,此时需要用socket函数来创建地址族为 AF_INET的一个套接口,同时将套接口的类型设为 SOCK_DGRAM。要想将套接口加入一个多播组,要使用如 下结构: srtuct ip_mreq{ struct in_addr imr_multiaddr; struct in_addr imr_interface; }; • 在ip_mreq结构中,imr_multiaddr对应于套接口将要加入的 那个多播组的二进制格式地址;而imr_interface对应于将要 用来收发多播数据的一个本地接口。
SO_DONTLINGER SO_LINGER SO_LINGER 不关心 0 ≠0 方式 优雅 强制 优雅 待 否 否 是
• SO_KEEPALIVE:该选项可以获取,也可以设置,它只适用 于以TCP为基础的套接口。服务器(例如FTP服务器)一般要设置 该选项,这样当客户在非正常终止连接的情况下,经过一段时 间后,服务器也能终止该连接。 • SO_RCVBUF:该选项可以获取,也可以设置。 • SO_SNDBUF : 该 选 项 可 以 获 取 , 也 可 以 设 置 。 与 SO_RCVBUF选项相对应,该选项用于确定发送缓冲区的大小。 • SO_SNDTIMEO:该选项可以获取,也可以设置。 • SO_RCVTIMEO:该选项可以获取,也可以设置。 • SO_REUSEADDR:该选项可以获取,也可以设置,表示该套 接口能和一个已在使用中的地址捆绑。
≠0
=0
设置
制”或“野蛮”关闭。因为套接口的虚电路立即被复位(发送一 个 RST 给对方),且丢失了未发送的所有数据,此时在远端的 recv( )调用将以 WSAECONNRESET 出错 系统执行默认的操作,l_linger 参数将被忽略,closesocket( )
=0

关闭
将立即返回
• SO_DONTLINGER:可以获取,也可以设置。 • 若在一个流类套接口上设置了SO_DONTLINGER选项, 也就是说将linger结构的l_onoff域设为0,则 closesocket( )调用立即返回,但是,如果可能,排队的 数据将在套接口关闭之前被发送。 • SO_DONTLINGER和SO_LINGER选项将直接影响使用 closesocket( )函数关闭一个套接口时系统对套接口的操 套接口关闭 套接口在关闭前是否等 作行为。 选 项 间隔时间
SO_LINGER选项取值情况说明
l_onoff l_linger SO_LINGER 说 明
意味着当调用 closesocket( )函数关闭一个套接口时,进程将 进入睡眠状态(即被阻塞), 直到所剩数据发送完毕或超出规定的 时间(超时时间由 l_linger 设定),这种关闭称为“优雅”的关闭,
• 允许一个布尔型选项,则将optval指向一个非零的整型数; 禁止一个布尔型选项,则可以将optval指向一个等于零的整 型数。对于布尔型选项,optlen应等于sizeof(int)。对于非布 尔型的其他选项,optval应该指向包含所需选项的整型量或 结构量,而optlen则为整形量或结构量的长度。 • 套接口的有些属性值既可以设置(即可以使用setsockopt( )函 数),也可以获取(即使用getsockopt( )函数),但有些套接口 属性只能获取或只能设置。 • 其 他 两 种 选 项 级 别 (IPPROTO_IP 和 IPPROTO_TCP) 与 SOL_SOCKET选项级别的情况类似。
Struct Linger 获取/设置 获取/设置
SO_DONTLINGER BOOL SO_KEEPALIVE SO_RCVBUF BOOL int
如果是TRUE,则禁用SO_LINGER 获取/设置 如果是TRUE,套接口就会进行配置,在会话过程中发送 “保持活动”消息 获取/设置 接收缓冲区长度 如果是TRUE,套接口就可与一个正由其他套接口使用的 获取/设置 地址绑定到一起,或与处在TIME_WAIT状态的地址绑定 到一起 获取/设置 获取/设置 获取/设置 用于设置一个阻塞套接口上的接收超时值(以毫秒为单位) 发送数据缓冲区长度 获取或设置套接口上的数据发送超时时间(以毫秒为单位)
第8讲 套接字选项与原始套接 字
内容回顾
• • • • ICMP功能 ICMP的层次 ICMP报文类型 ICMP报文结构
相关文档
最新文档