一、执行过程
- 启动服务端
sudo tcpdump -i any -s 0 -w kill.dat 'tcp and host 192.168.5.28 and port 55535'
- 启动客户端
kill 客户端进程id
- 停掉 tcpdump 进程
- 用 Wireshark 解析 kill.dat
二、代码示例
#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;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);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;
}
#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;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);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;
}