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
相关推荐
在深入探讨`setsockopt`的使用方法之前,我们首先需要了解`setsockopt`的基本概念。`setsockopt`是用于修改套接字选项的函数,它允许用户根据需求调整套接字的行为,从而优化网络通信性能或满足特定的应用场景需求。...
为了更精细地控制套接字关闭行为,可以使用`linger`结构体: ```c++ struct linger { u_short l_onoff; u_short l_linger; }; linger m_sLinger; m_sLinger.l_onoff = 1; // 当closesocket()被调用时,即使还有...
在发送数据的过程中,如果调用 closesocket(),而数据还没有发送完毕,可以使用 setsockopt() 函数设置 LINGER 选项。例如: linger m_sLinger; m_sLinger.l_onoff=1; m_sLinger.l_linger=5; setsockopt(s,SOL_...
如果设置为非零值,且`linger.l_onoff`为非零,套接字将在指定的时间内尝试发送所有数据,即使已经调用了`close()`。 - `TCP_NODELAY`: 禁用Nagle算法,该算法将小数据段合并成更大的数据包以减少网络传输。禁用它...
使用`SO_LINGER`选项可以控制在`closesocket()`调用后未发送完的数据如何处理。将`l_onoff`设为1表示在关闭时允许等待数据发送,`l_linger`则定义了允许等待的时间,如5秒。这样可以确保数据完整发送后再关闭Socket...
- 在完成通信后,应使用`Socket.close()`和`ServerSocket.close()`方法关闭Socket和ServerSocket,释放网络资源。不正确地关闭Socket可能会导致资源泄露。 5. **多线程处理** - 当服务器需要同时处理多个客户端...
- `"linger.ms"`:指定生产者等待新消息加入批次的延迟时间,如果在此时间内有更多消息到达,则会组成更大的批次发送。 - `"buffer.memory"`:设置生产者用于缓冲待发送消息的内存大小。 - `"key.serializer"` 和...
使用 `close()` 方法关闭 Socket 和流。 ### 8. 真机兼容性问题 虽然 J2ME Socket 编程提供了一种标准的通信方式,但不同设备的实现可能存在差异,且部分旧设备可能不完全支持某些特性。在实际应用中,需注意测试...
- 使用`close()`函数关闭Socket,TCP会发送FIN标志的报文段通知对方关闭连接。 6. **多线程与并发处理**: - 对于服务器来说,当多个客户端同时连接时,通常采用多线程或多进程处理,以实现并发服务。 - 使用`...
9. **关闭与释放资源**:`close`方法用于终止连接并释放相关的系统资源,确保程序不会泄漏套接字句柄。 10. **示例代码**:为了便于学习和使用,VTcpSocket通常会附带一些示例代码,展示如何创建客户端和服务器,...
十、 知道常见灭火器的使用方法,并了解如何扑救初起火灾。Know how to use common fire extinguishers and how to extinguish initial stage fires.十一、 教育儿童不玩火,将打火机、火柴等放在儿童接触不到的地方...
在"Windows Sockets 规范及应用——Windows网络编程接口"这本书中,作者深入浅出地介绍了Winsock的基本概念、核心组件和使用方法。书中的内容可能包括以下几个方面: 1. **Winsock基本概念**:解释什么是Windows ...
4. **服务器接受连接**:服务器使用ServerSocket的accept()方法阻塞等待客户端的连接请求,当请求到达时,accept()返回一个新的Socket对象,代表与客户端的连接。 5. **Socket通信**:此时,客户端和服务器可以使用...
3. **Attach( )**: 使用此函数可以将已存在的套接字句柄与`CAsyncSocket`对象关联,以便进行进一步的网络操作。 4. **Bind( )**: `Bind()`用于将本地IP地址和端口号绑定到套接字,这通常是服务器端在启动时执行的...
"Linux下socket编程.doc"可能会详细解释如何在Linux环境中配置和使用socket,包括`socket()`、`bind()`、`listen()`、`accept()`、`connect()`、`send()`、`recv()`等函数的用法。Linux还提供了套接字选项,如`SO_...
6. **关闭和清理**:完成通信后,使用`shutdown`关闭数据传输,最后调用`closesocket`关闭套接字。记得在程序退出前调用`WSACleanup`来释放Winsock资源。 7. **错误处理**:Winsock提供了丰富的错误代码,例如...
在Windows操作系统中,网络编程是实现跨机器通信的关键技术,它允许程序通过互联网或局域网进行数据交换。本文将深入探讨Windows网络编程...开发者可以根据项目需求,选择合适的方法和工具,灵活应对各种网络编程挑战。
在Windows系统中,Winsock(Windows Sockets)提供了一种标准的方法来访问网络协议,如TCP/IP,使得开发者无需深入理解底层网络细节就能编写网络应用。 1. **Winsock的初始化** 在使用Winsock进行网络编程之前,...
Socket 还允许设置各种选项,例如套接字缓冲区大小、是否启用 TCP_NODELAY(禁用 Nagle 算法)、SO_LINGER 等,这些选项可以通过 `setOption()` 方法设置。 通过深入研究 Java Socket 的源码,我们可以更清晰地...