Необработанный сокет не получает пакет UDP - PullRequest
0 голосов
/ 24 октября 2019

Я написал приложение с использованием необработанных сокетов, которое создает UDP-пакет и отправляет его по назначению. Приложение работает нормально, и я даже видел пакет, отправленный с помощью Wireshark. Теперь я хочу, чтобы этот пакет был перехвачен другим приложением в системе назначения. Я хочу иметь возможность доступа к заголовку UDP в системе назначения. Итак, я создал приемник, используя необработанные сокеты в системе dest. Но я не могу получить пакет для своего приложения. Я могу захватить пакет с помощью сокета SOCK_DGRAM, но не с необработанным сокетом.

Я помню, что читал, что в необработанных сокетах нет концепции портов. Может кто-нибудь объяснить, что именно происходит в системе dest, как работает демультиплексирование на транспортном уровне и как поле протокола заголовка ip влияет на функциональность транспортного уровня?

Код отправителя:

int main(void){

    char message[] = "This is something very useful";

    int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);

    if(sockfd < 0){
        perror("Error creating socket");
        exit(1);
    }

    struct sockaddr_in this, other;

    this.sin_family = AF_INET;
    other.sin_family = AF_INET;

    this.sin_port = htons(9000);
    other.sin_port = htons(8000);

    this.sin_addr.s_addr = INADDR_ANY;
    other.sin_addr.s_addr = inet_addr("127.0.0.1");

    if(bind(sockfd, (struct sockaddr *)&this, sizeof(this)) < 0){
        printf("Bind failed\n");
        exit(1);
    }

    char packet[64];
    memset(packet, 0, 64);

    struct udphdr *udph = (struct udphdr *) packet;
    strcpy(packet + sizeof(struct udphdr), message);

    udph->uh_sport = htons(8080);
    udph->uh_dport = htons(8000);
    udph->uh_ulen = htons(sizeof(struct udphdr) + sizeof(message));
    udph->uh_sum = 0;

    if(sendto(sockfd, packet, sizeof(struct udphdr) + sizeof(message), 0, (struct sockaddr *) &other, sizeof(other)) < 0)
        perror("Error");
    else
        printf("Packet sent successfully\n");

    close(sockfd);

    return 0;
}

Код получателя:

int main(void){

    int sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);

    char message[64];

    if(sockfd < 0){
        perror("Error creating socket");
        exit(1);
    }

    struct sockaddr_in this;
    this.sin_family = AF_INET;
    this.sin_port = htons(8000);
    this.sin_addr.s_addr = INADDR_ANY;

    if(bind(sockfd, (struct sockaddr *)&this, sizeof(this)) < 0){
        printf("Bind failed\n");
        exit(1);
    }

    if(recv(sockfd, message, 64, 0) < 0){
        perror("Error");
        exit(1);
    }

    printf("\n\n%s\n\n", message);

    close(sockfd);
    return 0;
}
...