• 网络编程1


    网络编程中,客户端调用close或者shutdown后,操作系统会给服务器发送一个FIN

    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main() {
        int sockfd;
        struct sockaddr_in server_addr;
    
        // 创建套接字
        sockfd = socket(AF_INET, SOCK_STREAM, 0);
        if (sockfd == -1) {
            perror("socket");
            exit(EXIT_FAILURE);
        }
    
        // 设置服务器地址和端口
        memset(&server_addr, 0, sizeof(server_addr));
        server_addr.sin_family = AF_INET;
        server_addr.sin_port = htons(12345);
        if (inet_pton(AF_INET, "127.0.0.1", &server_addr.sin_addr) <= 0) {
            perror("inet_pton");
            close(sockfd);
            exit(EXIT_FAILURE);
        }
    
        // 连接到服务器
        if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
            perror("connect");
            close(sockfd);
            exit(EXIT_FAILURE);
        }
    
        // 发送数据
        const char *message = "Hello, Server!";
        send(sockfd, message, strlen(message), 0);
    
        // 关闭套接字,触发FIN包的发送
        close(sockfd);
    
        // 由于调用了close,套接字sockfd已无效,不再执行任何操作
    
        return 0;
    }
    
    

    TCP连接关闭过程
    在TCP协议中,连接的关闭通常经历以下几个阶段:

    客户端调用 close:
    客户端调用 close 函数关闭套接字。
    操作系统会发送一个 FIN 包给服务器,表示客户端不会再发送数据。

    服务器接收 FIN:
    服务器接收到 FIN 包后,会向客户端发送一个 ACK(Acknowledgment)包,确认已经接收到 FIN。
    服务器进入半关闭状态,可以继续向客户端发送数据,但不能再接收数据。

    服务器调用 close:
    当服务器完成数据发送并准备关闭连接时,会调用 close 函数。
    服务器发送一个 FIN 包给客户端,表示服务器也不会再发送数据。

    客户端接收 FIN:
    客户端接收到服务器的 FIN 包后,向服务器发送一个 ACK 包,确认已经接收到 FIN。
    客户端完全关闭连接,释放相关资源。

    连接完全关闭:
    当双方都发送并接收到 FIN 和 ACK 包后,连接才完全关闭。

  • 相关阅读:
    01_中间件
    D. Minimal Height Tree(如何BFS遍历序列使树的高度最小)
    HTTPS一定安全吗
    教你一招轻松搞定mp3格式转换
    基于SSM的高校教师科研信息展示网站的设计与实现
    【JavaEE】操作系统与进程
    ThingsBoard如何实现设备自注册
    HTML5 <video> 标签属性、API 方法、事件、自定义样式详解与实用示例
    C++中将 sizeof( )用于指针的结果
    Keras深度学习实战——交通标志识别
  • 原文地址:https://blog.csdn.net/bonfirelit/article/details/139862646