인디노트

iphdr 를 이용해서 tcphdr 를 찾는 C 코드 본문

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

iphdr 를 이용해서 tcphdr 를 찾는 C 코드

인디개발자 2023. 4. 13. 11:24
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <arpa/inet.h>

void process_packet(unsigned char *buffer, int size);

int main()
{
    int sock_raw;
    int tcp_count = 0;
    struct sockaddr_in source, dest;
    unsigned char *buffer = (unsigned char*)malloc(65536);

    sock_raw = socket(AF_INET, SOCK_RAW, IPPROTO_TCP);
    if (sock_raw < 0)
    {
        printf("Error creating socket. Exiting...\n");
        return 1;
    }

    while (1)
    {
        struct sockaddr saddr;
        int saddr_len = sizeof(saddr);
        int data_size = recvfrom(sock_raw, buffer, 65536, 0, &saddr, &saddr_len);
        if (data_size < 0)
        {
            printf("Error receiving data. Exiting...\n");
            return 1;
        }

        process_packet(buffer, data_size);
    }

    close(sock_raw);
    printf("TCP count: %d\n", tcp_count);
    return 0;
}

void process_packet(unsigned char *buffer, int size)
{
    struct iphdr *iph = (struct iphdr*)buffer;
    if (iph->protocol == IPPROTO_TCP)
    {
        struct tcphdr *tcph = (struct tcphdr*)(buffer + (iph->ihl * 4));
        printf("Source Port: %d\n", ntohs(tcph->source));
        printf("Dest Port: %d\n", ntohs(tcph->dest));
        printf("Sequence Number: %u\n", ntohl(tcph->seq));
        printf("Acknowledge Number: %u\n", ntohl(tcph->ack_seq));
        printf("Header Length: %d\n", tcph->doff * 4);
        printf("Flags: ");
        if (tcph->urg)
            printf("U");
        if (tcph->ack)
            printf("A");
        if (tcph->psh)
            printf("P");
        if (tcph->rst)
            printf("R");
        if (tcph->syn)
            printf("S");
        if (tcph->fin)
            printf("F");
        printf("\n\n");
    }
}

위 코드에서 process_packet() 함수는 모든 IP 패킷을 처리하고, 프로토콜이 TCP인 경우에만 tcphdr를 찾아 출력합니다. main() 함수에서는 소켓을 생성하고 패킷을 계속 수신하며, 수신된 TCP 패킷의 개수를 출력합니다. 주의할 점은 이 코드는 raw socket을 사용하므로 root 권한이 필요합니다.

반응형
Comments