인디노트

Multicast Packet 로부터 상대방 IP 알아내는 C 코드 본문

개발 플랫폼 및 언어/네트워크 기술

Multicast Packet 로부터 상대방 IP 알아내는 C 코드

인디개발자 2023. 4. 14. 01:54
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/udp.h>

#define MAX_BUF_LEN 2048

int main(int argc, char *argv[]) {
    int sockfd, n;
    char buffer[MAX_BUF_LEN];
    struct sockaddr_in servaddr, cliaddr;
    socklen_t len = sizeof(cliaddr);

    // 소켓 생성
    if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
        perror("socket creation failed");
        exit(EXIT_FAILURE);
    }

    // 소켓 옵션 설정
    int reuse = 1;
    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse)) < 0) {
        perror("setsockopt failed");
        exit(EXIT_FAILURE);
    }

    // 서버 주소 설정
    memset(&servaddr, 0, sizeof(servaddr));
    servaddr.sin_family = AF_INET;
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
    servaddr.sin_port = htons(atoi(argv[1]));

    // 바인드
    if (bind(sockfd, (const struct sockaddr *)&servaddr, sizeof(servaddr)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 멀티캐스트 그룹 조인
    struct ip_mreq mreq;
    mreq.imr_multiaddr.s_addr = inet_addr(argv[2]);
    mreq.imr_interface.s_addr = htonl(INADDR_ANY);
    if (setsockopt(sockfd, IPPROTO_IP, IP_ADD_MEMBERSHIP, &mreq, sizeof(mreq)) < 0) {
        perror("setsockopt failed");
        exit(EXIT_FAILURE);
    }

    // 패킷 수신 및 처리
    while (1) {
        n = recvfrom(sockfd, (char *)buffer, MAX_BUF_LEN, 0, (struct sockaddr *)&cliaddr, &len);
        if (n < 0) {
            perror("recvfrom failed");
            exit(EXIT_FAILURE);
        }

        // 패킷 처리
        struct iphdr *ip_hdr = (struct iphdr *)buffer;
        struct udphdr *udp_hdr = (struct udphdr *)(buffer + sizeof(struct iphdr));
        char *payload = buffer + sizeof(struct iphdr) + sizeof(struct udphdr);

        // 상대방 IP 주소 출력
        printf("Received packet from %s\n", inet_ntoa(cliaddr.sin_addr));
    }

    // 소켓 닫기
    close(sockfd);

    return 0;
}

위 코드에서는 socket() 함수를 사용하여 소켓을 생성하고, setsockopt() 함수를 사용하여 소켓 옵션을 설정합니다. 그리고 bind() 함수를 사용하여 서버 주소를 설정하고, setsockopt() 함수를 사용하여 멀티캐스트 그룹에 조인합니다. 마

반응형
Comments