/
bvs22
/
draft
Обзор
Документация
Войти
/
bvs22
/
draft
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
network/raw_socket/server.c
105 строк
3 KB
Batomunkuev Vladimir
123
19 фев 2025, 16:09
19 фев 2025, 16:09
7a3db42
Код
Авторство
О чём код?
#include <stdio.h> #include <netinet/in.h> #include <sys/socket.h> #include <string.h> #include <arpa/inet.h> #include <stdlib.h> #include <netinet/ip.h> // Для IP заголовков #include <netinet/udp.h> // Для UDP заголовков #define BUF_SIZE 4096 // Структура UDP заголовка struct udp_header { uint16_t src_port; uint16_t dest_port; uint16_t length; uint16_t checksum; }; // Структура IP заголовка struct ip_header { unsigned char iph_ihl:4, iph_ver:4; unsigned char iph_tos; unsigned short iph_len; unsigned short iph_ident; unsigned short iph_flag:3, iph_offset:13; unsigned char iph_ttl; unsigned char iph_protocol; unsigned short iph_chksum; struct in_addr iph_sourceip; struct in_addr iph_destip; }; // Функция для расчета контрольной суммы unsigned short checksum(void *b, int len) { unsigned short *buf = b; unsigned int sum = 0; unsigned short result; for (sum = 0; len > 1; len -= 2) sum += *buf++; if (len == 1) sum += *(unsigned char *)buf; sum = (sum >> 16) + (sum & 0xFFFF); sum += (sum >> 16); result = ~sum; return result; } int main() { int fd_socket; struct sockaddr_in addr_server, addr_client; socklen_t len_addr = sizeof(addr_client); char buffer[BUF_SIZE]; fd_socket = socket(AF_INET, SOCK_RAW, IPPROTO_UDP); if (fd_socket < 0) { perror("Ошибка при создании сокета"); return 1; } printf("Сокет создан\n"); memset(&addr_server, 0, sizeof(addr_server)); addr_server.sin_family = AF_INET; addr_server.sin_port = htons(7777); addr_server.sin_addr.s_addr = INADDR_ANY; if (bind(fd_socket, (struct sockaddr *)&addr_server, sizeof(addr_server)) < 0) { perror("Ошибка при привязке сокета"); close(fd_socket); return 1; } printf("Ожидаем получения данных\n"); // Чтение пакета int n = recvfrom(fd_socket, buffer, BUF_SIZE, 0, (struct sockaddr *)&addr_client, &len_addr); if (n < 0) { perror("Ошибка при получении данных"); close(fd_socket); return 1; } struct ip_header *ip_hdr = (struct ip_header *)buffer; struct udp_header *udp_hdr = (struct udp_header *)(buffer + sizeof(struct ip_header)); // Печать IP и UDP заголовков printf("IP источник: %s\n", inet_ntoa(ip_hdr->iph_sourceip)); printf("IP назначение: %s\n", inet_ntoa(ip_hdr->iph_destip)); printf("UDP источник: %d\n", ntohs(udp_hdr->src_port)); printf("UDP назначение: %d\n", ntohs(udp_hdr->dest_port)); // Изменяем данные и отправляем обратно char *response = "Data received and modified!"; sendto(fd_socket, response, strlen(response), 0, (struct sockaddr *)&addr_client, sizeof(addr_client)); close(fd_socket); return 0; }