Advertisement
dtorkin

Untitled

Oct 15th, 2024 (edited)
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.24 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <arpa/inet.h>
  5. #include <unistd.h>
  6. #include <sys/select.h>
  7.  
  8. #define SIZE 1024
  9.  
  10. // Функция для отправки сообщений
  11. void send_message(int sockfd, struct sockaddr_in *addr, socklen_t addr_len, char *message) {
  12.     if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)addr, addr_len) == -1) {
  13.         perror("Ошибка при отправке сообщения");
  14.         exit(1);
  15.     }
  16. }
  17.  
  18. // Функция для приёма сообщений
  19. void receive_message(int sockfd, struct sockaddr_in *addr, socklen_t *addr_len) {
  20.     char buffer[SIZE];
  21.     int n = recvfrom(sockfd, buffer, SIZE, 0, (struct sockaddr *)addr, addr_len);
  22.     if (n > 0) {
  23.         buffer[n] = '\0';  // Заканчиваем строку
  24.         printf("Сообщение получено: %s\n", buffer);
  25.     }
  26. }
  27.  
  28. int main(int argc, char *argv[]) {
  29.     char *ip = "192.168.189.137";  // IP сервера
  30.     int port = 8080;
  31.     int sockfd;
  32.     struct sockaddr_in server_addr, client_addr;
  33.     socklen_t addr_len;
  34.     fd_set read_fds, write_fds;
  35.     int max_fd;
  36.     int is_server = 0;
  37.  
  38.     if (argc != 2) {
  39.         printf("Использование: %s [server/client]\n", argv[0]);
  40.         exit(1);
  41.     }
  42.  
  43.     // Проверяем, сервер ли это
  44.     if (strcmp(argv[1], "server") == 0) {
  45.         is_server = 1;
  46.     }
  47.  
  48.     // Создаем UDP-сокет
  49.     sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  50.     if (sockfd < 0) {
  51.         perror("Ошибка при создании сокета");
  52.         exit(1);
  53.     }
  54.     printf("UDP сокет успешно создан.\n");
  55.  
  56.     server_addr.sin_family = AF_INET;
  57.     server_addr.sin_port = htons(port);
  58.  
  59.     if (is_server) {
  60.         // Сервер будет ожидать сообщения от клиентов
  61.         server_addr.sin_addr.s_addr = inet_addr("0.0.0.0");
  62.  
  63.         // Привязываем сокет к IP и порту
  64.         if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
  65.             perror("Ошибка привязки");
  66.             exit(1);
  67.         }
  68.         printf("Привязка на сервере успешна. Ожидание сообщений...\n");
  69.     } else {
  70.         // Клиент будет отправлять сообщения на сервер
  71.         server_addr.sin_addr.s_addr = inet_addr(ip);
  72.         addr_len = sizeof(server_addr);
  73.     }
  74.  
  75.     // Основной цикл асинхронной передачи сообщений
  76.     while (1) {
  77.         FD_ZERO(&read_fds);
  78.         FD_ZERO(&write_fds);
  79.  
  80.         FD_SET(sockfd, &read_fds);  // Ожидание данных для чтения
  81.         FD_SET(sockfd, &write_fds);  // Ожидание возможности отправить данные
  82.  
  83.         max_fd = sockfd + 1;
  84.  
  85.         // Используем select для асинхронной передачи
  86.         if (select(max_fd, &read_fds, &write_fds, NULL, NULL) < 0) {
  87.             perror("Ошибка select");
  88.             exit(1);
  89.         }
  90.  
  91.         // Если есть данные для чтения
  92.         if (FD_ISSET(sockfd, &read_fds)) {
  93.             if (is_server) {
  94.                 addr_len = sizeof(client_addr);
  95.                 receive_message(sockfd, &client_addr, &addr_len);  // Сервер получает от клиента
  96.             } else {
  97.                 receive_message(sockfd, &server_addr, &addr_len);  // Клиент получает от сервера
  98.             }
  99.         }
  100.  
  101.         // Если можно отправлять данные
  102.         if (FD_ISSET(sockfd, &write_fds)) {
  103.             if (is_server) {
  104.                 send_message(sockfd, &client_addr, addr_len, "Привет от сервера!\n");  // Сервер отправляет клиенту
  105.             } else {
  106.                 send_message(sockfd, &server_addr, addr_len, "Привет от клиента!\n");  // Клиент отправляет серверу
  107.             }
  108.             sleep(1);  // Немного ждем, чтобы избежать постоянной отправки
  109.         }
  110.     }
  111.  
  112.     close(sockfd);
  113.     return 0;
  114. }
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement