cascade_modbus_tcp.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. #include "cascade_modbus_tcp.h"
  2. #include "modbus.h"
  3. #include "mb.h"
  4. #include "stdio.h"
  5. #include "string.h"
  6. #include "thread.h"
  7. #include <sys/socket.h>
  8. #include <netdb.h>
  9. #include <fcntl.h>
  10. #include <unistd.h>
  11. #include "errno.h"
  12. #include "stdlib.h"
  13. #include "stdio.h"
  14. #include <arpa/inet.h>
  15. #define BUFFER_SIZE 1024
  16. #define PORT 8888
  17. typedef struct {
  18. int server_fd;
  19. struct sockaddr_in server_addr;
  20. }server_t;
  21. static server_t server={0};
  22. void *pthread_handle_tcp(void *argv)
  23. {
  24. int client_fd = *(int *)(argv);
  25. char buffer[BUFFER_SIZE];
  26. ssize_t n;
  27. // ??:????? IP ???
  28. struct sockaddr_in addr;
  29. socklen_t addr_len = sizeof(addr);
  30. char ip_str[32] = {0};
  31. getpeername(client_fd, (struct sockaddr*)&addr, &addr_len);
  32. inet_ntop(AF_INET, &addr.sin_addr, ip_str, sizeof(ip_str));
  33. printf("[Thread %lu] New client: %s:%d\n", pthread_self(),
  34. ip_str, ntohs(addr.sin_port));
  35. // ??????:?????????(echo)
  36. while ((n = read(client_fd, buffer, sizeof(buffer) - 1)) > 0) {
  37. buffer[n] = '\0';
  38. printf("[Thread %lu] Received: %s\n", pthread_self(), buffer);
  39. // ??????
  40. write(client_fd, buffer, n);
  41. }
  42. if (n == 0) {
  43. printf("[Thread %lu] Client disconnected\n", pthread_self());
  44. } else if (n == -1) {
  45. LOG_E("read error");
  46. }
  47. close(client_fd);
  48. return NULL;
  49. }
  50. void * server_accept_thread(void *argv)
  51. {
  52. int client_fd = -1;
  53. pthread_t thread_id = 0;
  54. while(1)
  55. {
  56. struct sockaddr_in addr;
  57. socklen_t addrlen;
  58. addrlen = sizeof(addr);
  59. client_fd = accept(server.server_fd,(struct sockaddr *)&addr,&addrlen);
  60. if(client_fd > 0)
  61. {
  62. pthread_create(&thread_id,NULL,pthread_handle_tcp,(void*)(&client_fd));
  63. pthread_detach(thread_id);
  64. }
  65. }
  66. pthread_exit(0);
  67. }
  68. void cascade_md_init(void)
  69. {
  70. char buffer[BUFFER_SIZE] = {0};
  71. if ((server.server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
  72. LOG_E("socket failed");
  73. return;
  74. }
  75. int opt = 1;
  76. if (setsockopt(server.server_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
  77. LOG_E("setsockopt");
  78. close(server.server_fd);
  79. return;
  80. }
  81. server.server_addr.sin_family = AF_INET;
  82. server.server_addr.sin_addr.s_addr = INADDR_ANY;
  83. server.server_addr.sin_port = htons(PORT);
  84. if (bind(server.server_fd, (struct sockaddr *)&server.server_addr, sizeof(server.server_addr)) < 0) {
  85. LOG_E("bind failed");
  86. close(server.server_fd);
  87. return;
  88. }
  89. if (listen(server.server_fd, 7) == -1) {
  90. LOG_E("listen");
  91. close(server.server_fd);
  92. return;
  93. }
  94. pthread_t id;
  95. pthread_create(&id,NULL,server_accept_thread,NULL);
  96. pthread_detach(id);
  97. }