当前位置: 首页 > 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;
}
http://www.lqws.cn/news/506125.html

相关文章:

  • ABP VNext + BFF(Backend for Frontend)模式:Angular/React 专用聚合层
  • 【软考高级系统架构论文】论单元测试方法及应用
  • 技术QA | ADC/DAC芯片测试研讨会笔记请查收!
  • uni-app项目实战笔记24--uniapp实现图片保存到手机相册
  • 【matlab定位代码】基于AOA和TDOA混合的定位方法,背景为三维空间,自适应锚点数量,订阅专栏后可直接查看源代码
  • 记录写一个markdown-it插件来转换视频
  • HTML基础知识
  • Flask(五) 表单处理 request.form
  • day41/60
  • 51c嵌入式~电路~合集8
  • 集群聊天服务器---muduo库使用(2)
  • Kafka如何保证消息可靠?
  • 应用交付厂商F5发布全新应用交付与安全平台,全面释放AI潜能
  • Kubernetes 从入门到精通-StatefulSet控制器
  • vue 路由学习
  • Lost connection to Mysql server at ‘reading initial communication packet‘如何解决?
  • 09-Python函数详解
  • Anaconda虚拟环境安装torch-gpu
  • Linux操作系统Nginx Web服务
  • C++的单例模式
  • 【PDF】Java itextpdf 生成PDF时添加自定义页脚
  • 【android bluetooth 协议分析 05】【蓝牙连接详解2】【acl_interface_t介绍】
  • C预处理详解2
  • 桌面小屏幕实战课程:DesktopScreen 7 文件系统
  • 01-StarRocks安装部署FAQ
  • HOW - 图片的一倍图、二倍图和三倍图
  • 【Pandas】pandas DataFrame merge
  • 鸿蒙开发 一 (八)、自定义绘制
  • 3DSwiper 好看的走马灯轮播图
  • Meson介绍及编译Glib库