`
san_yun
  • 浏览: 2652368 次
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

linger close用法

 
阅读更多

Linux下tcp连接断开的时候调用close()函数,有优雅断开和强制断开两种方式。

那么如何设置断开连接的方式呢?是通过设置socket描述符一个linger结构体属性。

linger结构体数据结构如下: 

#include <arpa/inet.h>

struct linger {
  int l_onoff;
  int l_linger;
};

 

三种断开方式:

1. l_onoff = 0; l_linger忽略

close()立刻返回,底层会将未发送完的数据发送完成后再释放资源,即优雅退出。

 

2. l_onoff != 0; l_linger = 0;

close()立刻返回,但不会发送未发送完成的数据,而是通过一个REST包强制的关闭socket描述符,即强制退出。

 

3. l_onoff != 0; l_linger > 0;

close()不会立刻返回,内核会延迟一段时间,这个时间就由l_linger的值来决定。如果超时时间到达之前,发送完未发送的数据(包括FIN包)并得到另一端的确认,close()会返回正确,socket描述符优雅性退出。否则,close()会直接返回错误值,未发送数据丢失,socket描述符被强制性退出。需要注意的时,如果socket描述符被设置为非堵塞型,则close()会直接返回值。

 

具体用法:

struct linger ling = {0, 0};
setsockopt(socketfd, SOL_SOCKET, SO_LINGER, (void*)&ling, sizeof(ling));

 

 

 

参考:

http://cs.nyu.edu/courses/spring00/V22.0480-002/class06.html

http://www.google.com.hk/#newwindow=1&q=socket%E5%BB%B6%E8%BF%9F%E5%85%B3%E9%97%AD&safe=strict

http://agapple.iteye.com/blog/947133

分享到:
评论

相关推荐

    setsockopt 设置socket 详细用法.doc

    在深入探讨`setsockopt`的使用方法之前,我们首先需要了解`setsockopt`的基本概念。`setsockopt`是用于修改套接字选项的函数,它允许用户根据需求调整套接字的行为,从而优化网络通信性能或满足特定的应用场景需求。...

    setsockopt()改善程序的健壮性

    为了更精细地控制套接字关闭行为,可以使用`linger`结构体: ```c++ struct linger { u_short l_onoff; u_short l_linger; }; linger m_sLinger; m_sLinger.l_onoff = 1; // 当closesocket()被调用时,即使还有...

    setsockopt()设置socket方法

    在发送数据的过程中,如果调用 closesocket(),而数据还没有发送完毕,可以使用 setsockopt() 函数设置 LINGER 选项。例如: linger m_sLinger; m_sLinger.l_onoff=1; m_sLinger.l_linger=5; setsockopt(s,SOL_...

    setsockopt函数使用说明

    如果设置为非零值,且`linger.l_onoff`为非零,套接字将在指定的时间内尝试发送所有数据,即使已经调用了`close()`。 - `TCP_NODELAY`: 禁用Nagle算法,该算法将小数据段合并成更大的数据包以减少网络传输。禁用它...

    setsockopt函数一片不错的文章

    使用`SO_LINGER`选项可以控制在`closesocket()`调用后未发送完的数据如何处理。将`l_onoff`设为1表示在关闭时允许等待数据发送,`l_linger`则定义了允许等待的时间,如5秒。这样可以确保数据完整发送后再关闭Socket...

    java socket 经典教程

    - 在完成通信后,应使用`Socket.close()`和`ServerSocket.close()`方法关闭Socket和ServerSocket,释放网络资源。不正确地关闭Socket可能会导致资源泄露。 5. **多线程处理** - 当服务器需要同时处理多个客户端...

    基于JAVA API方式使用Kafka——编写生产者客户端.docx

    - `"linger.ms"`:指定生产者等待新消息加入批次的延迟时间,如果在此时间内有更多消息到达,则会组成更大的批次发送。 - `"buffer.memory"`:设置生产者用于缓冲待发送消息的内存大小。 - `"key.serializer"` 和...

    j2me socket编程

    使用 `close()` 方法关闭 Socket 和流。 ### 8. 真机兼容性问题 虽然 J2ME Socket 编程提供了一种标准的通信方式,但不同设备的实现可能存在差异,且部分旧设备可能不完全支持某些特性。在实际应用中,需注意测试...

    Socket Tcp/IP

    - 使用`close()`函数关闭Socket,TCP会发送FIN标志的报文段通知对方关闭连接。 6. **多线程与并发处理**: - 对于服务器来说,当多个客户端同时连接时,通常采用多线程或多进程处理,以实现并发服务。 - 使用`...

    VTcpSocket

    9. **关闭与释放资源**:`close`方法用于终止连接并释放相关的系统资源,确保程序不会泄漏套接字句柄。 10. **示例代码**:为了便于学习和使用,VTcpSocket通常会附带一些示例代码,展示如何创建客户端和服务器,...

    优秀资料(2021-2022年收藏)消防安全常识二十条附英文翻译.doc

    十、 知道常见灭火器的使用方法,并了解如何扑救初起火灾。Know how to use common fire extinguishers and how to extinguish initial stage fires.十一、 教育儿童不玩火,将打火机、火柴等放在儿童接触不到的地方...

    Windows Sockets 规范及应用 Windows网络编程接口

    在"Windows Sockets 规范及应用——Windows网络编程接口"这本书中,作者深入浅出地介绍了Winsock的基本概念、核心组件和使用方法。书中的内容可能包括以下几个方面: 1. **Winsock基本概念**:解释什么是Windows ...

    java scoket 编程

    4. **服务器接受连接**:服务器使用ServerSocket的accept()方法阻塞等待客户端的连接请求,当请求到达时,accept()返回一个新的Socket对象,代表与客户端的连接。 5. **Socket通信**:此时,客户端和服务器可以使用...

    第9章 高级网络编程API

    3. **Attach( )**: 使用此函数可以将已存在的套接字句柄与`CAsyncSocket`对象关联,以便进行进一步的网络操作。 4. **Bind( )**: `Bind()`用于将本地IP地址和端口号绑定到套接字,这通常是服务器端在启动时执行的...

    socket编程

    "Linux下socket编程.doc"可能会详细解释如何在Linux环境中配置和使用socket,包括`socket()`、`bind()`、`listen()`、`accept()`、`connect()`、`send()`、`recv()`等函数的用法。Linux还提供了套接字选项,如`SO_...

    用TCP/IP进行网际互联第三卷 Windows中文版

    6. **关闭和清理**:完成通信后,使用`shutdown`关闭数据传输,最后调用`closesocket`关闭套接字。记得在程序退出前调用`WSACleanup`来释放Winsock资源。 7. **错误处理**:Winsock提供了丰富的错误代码,例如...

    WINDOWS网络编程技术

    在Windows操作系统中,网络编程是实现跨机器通信的关键技术,它允许程序通过互联网或局域网进行数据交换。本文将深入探讨Windows网络编程...开发者可以根据项目需求,选择合适的方法和工具,灵活应对各种网络编程挑战。

    winsock

    在Windows系统中,Winsock(Windows Sockets)提供了一种标准的方法来访问网络协议,如TCP/IP,使得开发者无需深入理解底层网络细节就能编写网络应用。 1. **Winsock的初始化** 在使用Winsock进行网络编程之前,...

    java socket 源码

    Socket 还允许设置各种选项,例如套接字缓冲区大小、是否启用 TCP_NODELAY(禁用 Nagle 算法)、SO_LINGER 等,这些选项可以通过 `setOption()` 方法设置。 通过深入研究 Java Socket 的源码,我们可以更清晰地...

Global site tag (gtag.js) - Google Analytics