LINGER使用说明

void CClientSocket::Disconnect()
{
	// 利用setsockopt(MSDN)函数设定套接字的选项,把此套接字设定为:
	//		假如有数据未发送,等待数据发送完后再关闭此套接字。
	//
	// If we're supposed to abort the connection, set the linger value on the socket to 0.
	// https://blog.csdn.net/factor2000/article/details/3929816
	// 设置 l_onoff为非0,l_linger为0,则套接口关闭时TCP夭折连接,TCP将丢弃保留在套接口发送缓冲区中的任何数据并发送一个RST给对方,而不是通常的四分组终止序列,这避免了TIME_WAIT状态
	LINGER lingerStruct;
	lingerStruct.l_onoff = 1;
	lingerStruct.l_linger = 0;
	setsockopt(m_Socket, SOL_SOCKET, SO_LINGER, (char *)&lingerStruct, sizeof(lingerStruct) );

	CancelIo((HANDLE) m_Socket); // 异步socket优雅的关闭,关闭socket时防止未发送的数据丢失

	InterlockedExchange((LPLONG)&m_bIsRunning, false); // 原子操作
	closesocket(m_Socket);

	SetEvent(m_hEvent);	// 设置为有信号

	m_Socket = INVALID_SOCKET;
}

code来自 Gh0st

`setsockopt` 函数用于设置套接字选项。`SO_LINGER` 是一个用于设置套接字关闭时的延迟关闭选项。当 `SO_LINGER` 被设置为非零值时,关闭套接字时将会等待一段时间,直到发送或接收缓冲区中的数据被发送或丢弃。这可以确保数据的可靠传输。当 `SO_LINGER` 被设置为零时,关闭套接字时将立即关闭,不管缓冲区中是否还有数据。 在 C 语言中,使用 `setsockopt` 函数来设置 `SO_LINGER` 选项的代码示例如下: ```c #include <sys/types.h> #include <sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void *optval, socklen_t optlen); ``` 其中,`sockfd` 是套接字描述符,`level` 是选项的级别(通常为 `SOL_SOCKET`),`optname` 是要设置的选项名称(在这里是 `SO_LINGER`),`optval` 是一个指向设置选项值的缓冲区的指针,`optlen` 是缓冲区的长度。 要设置 `SO_LINGER` 选项,可以按照以下步骤进行: ```c #include <sys/types.h> #include <sys/socket.h> int sockfd; struct linger so_linger; // 创建套接字 sockfd = socket(AF_INET, SOCK_STREAM, 0); // 设置 SO_LINGER 选项 so_linger.l_onoff = 1; // 非零值表示启用 SO_LINGER so_linger.l_linger = 5; // 延迟关闭时间为 5 秒 setsockopt(sockfd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof(so_linger)); // 关闭套接字 close(sockfd); ``` 在上面的示例中,我们创建了一个 TCP 套接字 `sockfd`,然后设置了 `SO_LINGER` 选项的值为非零,延迟关闭时间为 5 秒。最后,我们关闭了套接字。 请注意,`setsockopt` 函数返回值为 0 表示成功,-1 表示失败。你可以根据返回值进行错误处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值