Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <arpa/inet.h>
- #include <unistd.h>
- #include <sys/select.h>
- #define SIZE 1024
- // Функция для отправки сообщений
- void send_message(int sockfd, struct sockaddr_in *addr, socklen_t addr_len, char *message) {
- if (sendto(sockfd, message, strlen(message), 0, (struct sockaddr *)addr, addr_len) == -1) {
- perror("Ошибка при отправке сообщения");
- exit(1);
- }
- }
- // Функция для приёма сообщений
- void receive_message(int sockfd, struct sockaddr_in *addr, socklen_t *addr_len) {
- char buffer[SIZE];
- int n = recvfrom(sockfd, buffer, SIZE, 0, (struct sockaddr *)addr, addr_len);
- if (n > 0) {
- buffer[n] = '\0'; // Заканчиваем строку
- printf("Сообщение получено: %s\n", buffer);
- }
- }
- int main(int argc, char *argv[]) {
- char *ip = "192.168.189.137"; // IP сервера
- int port = 8080;
- int sockfd;
- struct sockaddr_in server_addr, client_addr;
- socklen_t addr_len;
- fd_set read_fds, write_fds;
- int max_fd;
- int is_server = 0;
- if (argc != 2) {
- printf("Использование: %s [server/client]\n", argv[0]);
- exit(1);
- }
- // Проверяем, сервер ли это
- if (strcmp(argv[1], "server") == 0) {
- is_server = 1;
- }
- // Создаем UDP-сокет
- sockfd = socket(AF_INET, SOCK_DGRAM, 0);
- if (sockfd < 0) {
- perror("Ошибка при создании сокета");
- exit(1);
- }
- printf("UDP сокет успешно создан.\n");
- server_addr.sin_family = AF_INET;
- server_addr.sin_port = htons(port);
- if (is_server) {
- // Сервер будет ожидать сообщения от клиентов
- server_addr.sin_addr.s_addr = inet_addr("0.0.0.0");
- // Привязываем сокет к IP и порту
- if (bind(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
- perror("Ошибка привязки");
- exit(1);
- }
- printf("Привязка на сервере успешна. Ожидание сообщений...\n");
- } else {
- // Клиент будет отправлять сообщения на сервер
- server_addr.sin_addr.s_addr = inet_addr(ip);
- addr_len = sizeof(server_addr);
- }
- // Основной цикл асинхронной передачи сообщений
- while (1) {
- FD_ZERO(&read_fds);
- FD_ZERO(&write_fds);
- FD_SET(sockfd, &read_fds); // Ожидание данных для чтения
- FD_SET(sockfd, &write_fds); // Ожидание возможности отправить данные
- max_fd = sockfd + 1;
- // Используем select для асинхронной передачи
- if (select(max_fd, &read_fds, &write_fds, NULL, NULL) < 0) {
- perror("Ошибка select");
- exit(1);
- }
- // Если есть данные для чтения
- if (FD_ISSET(sockfd, &read_fds)) {
- if (is_server) {
- addr_len = sizeof(client_addr);
- receive_message(sockfd, &client_addr, &addr_len); // Сервер получает от клиента
- } else {
- receive_message(sockfd, &server_addr, &addr_len); // Клиент получает от сервера
- }
- }
- // Если можно отправлять данные
- if (FD_ISSET(sockfd, &write_fds)) {
- if (is_server) {
- send_message(sockfd, &client_addr, addr_len, "Привет от сервера!\n"); // Сервер отправляет клиенту
- } else {
- send_message(sockfd, &server_addr, addr_len, "Привет от клиента!\n"); // Клиент отправляет серверу
- }
- sleep(1); // Немного ждем, чтобы избежать постоянной отправки
- }
- }
- close(sockfd);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement