Ошибка: неверный адрес при использовании sendto () в необработанных сокетах - PullRequest
1 голос
/ 24 октября 2019

Я пишу простое сетевое приложение, и мне нужно создать пакет UDP и отправить его на определенный хост.

int main(void){

    // Message to be sent.
    char message[] = "This is something";

    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(8080);
    other.sin_port = htons(8000);


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

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

    char packet[64] = {0};

    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, udph->uh_ulen, 0, (struct sockaddr *) &other, sizeof(other)) < 0)
        perror("Error");
    else
        printf("Packet sent successfully\n");

    close(sockfd);

    return 0;
}

Все работает нормально до вызова sendto (). Sendto () выдает «неверный адрес». Кто-нибудь может указать мне, где я иду не так? Есть ли проблема с привязкой порта к необработанному сокету?

1 Ответ

2 голосов
/ 24 октября 2019

Код преобразует длину сообщения (udph-> uh_len) в сетевой порядок байтов (htons). Это не нужно, так как тип параметра size_t. Только номер порта (в структурах sockaddr) нуждается в преобразовании htons.

    udph->uh_ulen = sizeof(struct udphdr) + sizeof(message);

Текущий код выдает большое число (> 8000) в uh_ulen, что приводит к сбою отправки.

...