| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125 |
- #include "cascade_modbus_tcp.h"
- #include "modbus.h"
- #include "mb.h"
- #include "stdio.h"
- #include "string.h"
- #include "thread.h"
- #include <sys/socket.h>
- #include <netdb.h>
- #include <fcntl.h>
- #include <unistd.h>
- #include "errno.h"
- #include "stdlib.h"
- #include "stdio.h"
- #include <arpa/inet.h>
- #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);
- }
|