Linux笔记

Linux

关闭服务器后无法立即重新bind

当你关闭一个服务器后,操作系统通常会有一段时间保留已关闭的socket端口,这段时间称为TIME_WAIT状态,它是TCP协议的一部分,旨在确保所有连接相关的数据包都已经被成功接收或丢弃,防止数据混乱。TIME_WAIT状态通常持续2MSL(Maximum Segment Lifetime,最大报文生存时间)的时间,大约为4分钟。

要解决关闭服务器后无法立即重新bind同一端口的问题,可以尝试以下几种方法:

  1. **使用SO_REUSEADDR套接字选项**:

在绑定socket之前,设置`SO_REUSEADDR`套接字选项允许在TIME_WAIT状态下重新绑定相同的地址。这在重启服务时特别有用,但需要注意,这样做有可能接收到来自之前连接的迟到数据包,除非你确保没有这种风险或者能够妥善处理这种情况。

```cpp

int yes = 1;

if (setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(yes)) == -1) {

perror("setsockopt(SO_REUSEADDR) failed");

// 处理错误

}

```

  1. **使用SO_LINGER套接字选项**:

通过设置`SO_LINGER`选项,可以控制socket关闭时的行为。设置一个零linger结构体可以使socket在关闭时立即发送RST(复位)而不是进入TIME_WAIT状态,但这种方法可能会导致数据丢失,且不是所有情况下都适用。

```cpp

struct linger ling = {1, 0}; // 第二个参数为0表示立即发送RST并关闭

setsockopt(socket_fd, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));

```

  1. **关闭socket前清理连接**:

尽量确保在关闭服务器前,所有客户端连接都已正确关闭,减少TIME_WAIT状态出现的机会。

  1. **使用不同的端口号**:

如果上述方法不适用或不可行,可以考虑在重启服务时使用不同的端口。

  1. **修改操作系统的TIME_WAIT时间**:

虽然不推荐,但在某些特定场景下,可以通过修改操作系统的TCP参数来缩短TIME_WAIT时间。这通常涉及编辑系统级别的配置文件,如Linux下的`/etc/sysctl.conf`,添加或修改如下行:

```

net.ipv4.tcp_fin_timeout = 30

```

然后运行`sudo sysctl -p`使更改生效。但请注意,这种方法可能带来潜在的TCP连接问题,不建议轻易改动。

选择合适的解决方案取决于你的具体需求和应用场景,务必权衡利弊后做出决定。

cout无法正常显示中文

虽然你使用了buf.length()来指定写入的字节数,但是在包含中文字符(UTF-8编码下每个中文字符占用3个字节)的情况下,直接使用length()可能不会正确反映实际的字节数,因为它给出的是字符数而非字节数。你应该使用

write写入一个枚举类型变量

要在C语言中使用`write`函数将一个枚举类型变量写入文件,你需要先将枚举变量转换为适当的字节格式。通常情况下,枚举类型在C语言中被实现为整数类型。因此,你可以将枚举变量转换为整数后使用`write`函数进行写入。以下是一个示例:

#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>

// 定义一个枚举类型
typedef enum {
    RED,
    GREEN,
    BLUE
} Color;

int main() {
    // 打开一个文件以便写入
    int fd = open("output.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
    if (fd < 0) {
        perror("open");
        return 1;
    }

    // 定义一个枚举变量
    Color color = GREEN;

    // 将枚举变量转换为整数
    int color_int = (int)color;

    // 将整数写入文件
    ssize_t bytes_written = write(fd, &color_int, sizeof(color_int));
    if (bytes_written != sizeof(color_int)) {
        perror("write");
        close(fd);
        return 1;
    }

    // 关闭文件
    close(fd);

    return 0;
}

在这个示例中:

  1. 定义了一个枚举类型 `Color`,其中包含 `RED`、`GREEN` 和 `BLUE` 三个值。

  2. 打开了一个名为 `output.txt` 的文件进行写入。

  3. 定义了一个枚举变量 `color` 并将其设置为 `GREEN`。

  4. 将枚举变量 `color` 转换为整数 `color_int`。

  5. 使用 `write` 函数将整数值写入文件。

  6. 关闭文件。

请确保在实际使用中根据需要处理文件打开和写入时的错误情况。

tab可自动补全命令行(只有一个文件时)

INADDR_ANY 是一个在网络编程中非常常见的常量,通常用于绑定套接字(socket)到所有可用的网络接口。这在实现服务器程序时尤为常见,表示服务器可以在任何网络接口上接收客户端的连接请求。

具体的全拼为:Internet Address Any

详细解释:

  • I - Internet(互联网):指网络协议。
  • N - Network(网络):指网络连接的范畴。
  • ADDR - Address(地址):指网络地址。
  • ANY - Any(任何):指任意的网络接口。

在实际使用中,INADDR_ANY 通常用在以下场景:

  • 在服务器端程序中,使用 bind 函数将套接字绑定到 INADDR_ANY,使得该服务器可以接受发往任何本地地址的连接。

listen返回的不是数量

结束进程后无法再次bind

当你尝试结束一个QTcpSocket并立即尝试重新bind同一个端口,却遇到失败的情况,这通常是因为TCP/IP协议栈需要一些时间来完全释放端口资源。即使你调用了QTcpSocket的关闭方法(如disconnectFromHost()close()),操作系统也可能需要一段时间来清理并重新开放该端口供绑定使用,这个时间取决于操作系统和网络堆栈的具体实现。

相关推荐
张声录15 分钟前
【ETCD】【实操篇(三)】【ETCDCTL】如何向集群中写入数据
数据库·chrome·etcd
无为之士11 分钟前
Linux自动备份Mysql数据库
linux·数据库·mysql
小蜗牛慢慢爬行18 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
MARIN_shen23 分钟前
Marin说PCB之POC电路layout设计仿真案例---06
网络·单片机·嵌入式硬件·硬件工程·pcb工艺
荒古前24 分钟前
龟兔赛跑 PTA
c语言·算法
小汤猿人类24 分钟前
open Feign 连接池(性能提升)
数据库
岑梓铭28 分钟前
(CentOs系统虚拟机)Standalone模式下安装部署“基于Python编写”的Spark框架
linux·python·spark·centos
努力学习的小廉28 分钟前
深入了解Linux —— make和makefile自动化构建工具
linux·服务器·自动化
MZWeiei32 分钟前
Zookeeper基本命令解析
大数据·linux·运维·服务器·zookeeper
阳冬园1 小时前
mysql数据库 主从同步
数据库·主从同步