当前位置: 首页 > news >正文

验证 TCP 连接在异常情况下的断开机制之进程(客户端)被 kill 掉

文章目录

  • 一、执行过程
  • 二、代码示例

一、执行过程

  1. 启动服务端
  2. sudo tcpdump -i any -s 0 -w kill.dat 'tcp and host 192.168.5.28 and port 55535'
  3. 启动客户端
  4. kill 客户端进程id
  5. 停掉 tcpdump 进程
  6. 用 Wireshark 解析 kill.dat

二、代码示例

/* tcp_server.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;#define IP          "192.168.5.28"
#define PORT        55535
#define BUFFER_SIZE 1024int main()
{int         sockfd, client_socket;sockaddr_in server_addr, client_addr;socklen_t   client_addr_len = sizeof(client_addr);char        buffer[BUFFER_SIZE];int         recv_len, send_len;char        client_ip[INET_ADDRSTRLEN];int         client_port;/* 创建 TCP 套接字 */if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket failed");exit(EXIT_FAILURE);}/* 设置服务器地址结构 */memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(PORT);/* 将 IPv4 地址从文本格式转换为网络字节序的二进制格式 */if (inet_pton(AF_INET, IP, &server_addr.sin_addr) <= 0){perror("inet_pton failed");close(sockfd);exit(EXIT_FAILURE);}/* 绑定套接字到指定地址和端口 */if (bind(sockfd, (sockaddr *)&server_addr, sizeof(server_addr)) < 0){perror("bind failed");close(sockfd);exit(EXIT_FAILURE);}/* 监听客户端连接请求 */if (listen(sockfd, 5) < 0){perror("bind failed");close(sockfd);exit(EXIT_FAILURE);}printf("Server listening on port %d...\n", PORT);accept_again:client_socket = accept(sockfd, (sockaddr *)&client_addr, &client_addr_len);if (client_socket < 0){perror("accept failed");close(sockfd);exit(EXIT_FAILURE);}if (NULL == inet_ntop(AF_INET, &client_addr.sin_addr, client_ip, INET_ADDRSTRLEN))printf("New client connection, sfd[%d]\n", client_socket);else{client_port = ntohs(client_addr.sin_port);printf("New client connection from %s:%d, sfd[%d]\n", client_ip, client_port, client_socket);}while (1){recv_len = read(client_socket, buffer, BUFFER_SIZE);if (recv_len < 0){perror("read failed");close(client_socket);close(sockfd);exit(EXIT_FAILURE);}else if (0 == recv_len){printf("Client disconnected, sfd[%d]\n", client_socket);/* 模拟服务端仍有数据需要发送到客户端 */sleep(10);close(client_socket);printf("Close fd[%d]\n", client_socket);break;}}goto accept_again;/* 关闭套接字 */close(sockfd);return 0;
}
/* tcp_client.c */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <arpa/inet.h>typedef struct sockaddr sockaddr;
typedef struct sockaddr_in sockaddr_in;#define SERVER_IP    "192.168.5.28"
#define SERVICE_PORT 55535
#define BUFFER_SIZE  1024int main()
{int         sockfd;sockaddr_in server_addr;socklen_t   server_addr_len = sizeof(server_addr);char        buffer[BUFFER_SIZE];int         len, send_len, recv_len;/* 创建 TCP 套接字 */if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){perror("socket failed");exit(EXIT_FAILURE);}/* 设置服务器地址结构 */memset(&server_addr, 0, sizeof(server_addr));server_addr.sin_family = AF_INET;server_addr.sin_port = htons(SERVICE_PORT);// 将 IPv4 地址从文本格式转换为网络字节序的二进制格式if (inet_pton(AF_INET, SERVER_IP, &server_addr.sin_addr) <= 0){perror("inet_pton failed");close(sockfd);exit(EXIT_FAILURE);}if (connect(sockfd, (sockaddr *)&server_addr, server_addr_len) < 0){perror("connect failed");close(sockfd);exit(EXIT_FAILURE);}printf("Connectied to server[%s:%d]\n", SERVER_IP, SERVICE_PORT);/* 模拟与服务端通信 */while (1)sleep(1);/* 关闭套接字 */close(sockfd);return 0;
}

相关文章:

  • 在线图片编辑源码广东seo推广公司
  • wordpress升级后出错aso关键词优化工具
  • 和朋友合伙做网站营销策划
  • 定制旅游网站建设成都seo工具是什么意思
  • 民宿网站开发dfd图友情链接官网
  • 1717做网站手机百度网页版
  • 如何将适用于 Docker 的 ONLYOFFICE 文档更新到 v9.0
  • React性能优化精髓之一:频繁setState导致滚动卡顿的解决方案
  • Verilog基础:编译指令`default_nettype
  • 图像融合中损失函数【3】--梯度强度损失
  • 从零开始学习Spring Cloud Alibaba (一)
  • 市面上重要的AI开发工具和框架
  • 快速搭建系统原型,UI界面,有哪些高效的AI工具和方法
  • Mysql之索引
  • 10-Python模块详解
  • git变更记录
  • 主机复制文字和文件到 Ubuntu 虚拟机
  • 【DeepSeek实战】3、Ollama实战指南:LobeChat+多网关架构打造高可用大模型集群
  • 【apache-maven3.9安装与配置】
  • 鸿蒙开发深入解析:Data Ability 数据共享机制全面指南
  • 性能测试 —— 数据库的连接池和主从同步和分表分区
  • 认识Scikit-learn/PyTorch/TensorFlow这几个AI框架
  • 杉岩数据受邀出席企业出海数字化沙龙,解析制造企业出海数字化密码
  • 2025年应用材料、机械与制造工程国际会议(ICAMMME 2025)
  • JDK 17 中 java.lang.System 常用方法及应用场景
  • 【150】基于SSM+Vue实现的小说阅读小程序(有文档)