#include "cascade_modbus_tcp.h" #include "modbus.h" #include "mb.h" #include "stdio.h" #include "string.h" #include "thread.h" #include #include #include #include #include "errno.h" #include "stdlib.h" #include "stdio.h" #include #define BUFFER_SIZE 1024 #define PORT 8888 typedef struct { int server_fd; struct sockaddr_in server_addr; }server_t; static server_t server={0}; void *pthread_handle_tcp(void *argv) { int client_fd = *(int *)(argv); char buffer[BUFFER_SIZE]; ssize_t n; // ??:????? IP ??? struct sockaddr_in addr; socklen_t addr_len = sizeof(addr); char ip_str[32] = {0}; getpeername(client_fd, (struct sockaddr*)&addr, &addr_len); inet_ntop(AF_INET, &addr.sin_addr, ip_str, sizeof(ip_str)); printf("[Thread %lu] New client: %s:%d\n", pthread_self(), ip_str, ntohs(addr.sin_port)); // ??????:?????????(echo) while ((n = read(client_fd, buffer, sizeof(buffer) - 1)) > 0) { buffer[n] = '\0'; printf("[Thread %lu] Received: %s\n", pthread_self(), buffer); // ?????? write(client_fd, buffer, n); } if (n == 0) { printf("[Thread %lu] Client disconnected\n", pthread_self()); } else if (n == -1) { LOG_E("read error"); } close(client_fd); return NULL; } void * server_accept_thread(void *argv) { int client_fd = -1; pthread_t thread_id = 0; while(1) { struct sockaddr_in addr; socklen_t addrlen; addrlen = sizeof(addr); client_fd = accept(server.server_fd,(struct sockaddr *)&addr,&addrlen); if(client_fd > 0) { pthread_create(&thread_id,NULL,pthread_handle_tcp,(void*)(&client_fd)); pthread_detach(thread_id); } } pthread_exit(0); } void cascade_md_init(void) { char buffer[BUFFER_SIZE] = {0}; if ((server.server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) { LOG_E("socket failed"); return; } int opt = 1; if (setsockopt(server.server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) { LOG_E("setsockopt"); close(server.server_fd); return; } server.server_addr.sin_family = AF_INET; server.server_addr.sin_addr.s_addr = INADDR_ANY; server.server_addr.sin_port = htons(PORT); if (bind(server.server_fd, (struct sockaddr *)&server.server_addr, sizeof(server.server_addr)) < 0) { LOG_E("bind failed"); close(server.server_fd); return; } if (listen(server.server_fd, 7) == -1) { LOG_E("listen"); close(server.server_fd); return; } pthread_t id; pthread_create(&id,NULL,server_accept_thread,NULL); pthread_detach(id); }