Семейство адресов не поддерживается протоколом UDP C Ошибка отправки - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь установить связь по протоколу UDP и получаю сообщение об ошибке: «Ошибка отправки: семейство адресов не поддерживается протоколом» .Я проверил в Google эту проблему, но не смог найти ответ.Пожалуйста, будьте терпеливы, я только начинаю свое приключение с кодирования на C. Вот код C:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <arpa/inet.h>

#define BUFLEN 512

// define function that deals with errors
void error(const char *msg)
{
    perror(msg); // print error msg
    exit(1); // exit the main() function
}

int main(int argc, char *argv[])
{
    struct sockaddr_in serv1_addr, serv2_addr, cli1_addr, cli2_addr; //definicja struktur adresów servera i clienta 
    struct hostent *server; //defines host addres struct
    int cl1_sockfd, se1_sockfd, se2_sockfd, i, c1len = sizeof(cli1_addr), c2len = sizeof(cli2_addr), recv_len, portno1,portno2; // creates inits
    int cli1_len = sizeof(cli1_addr);
    int cli2_len = sizeof(cli2_addr);

    char buf[BUFLEN];

    if (argc < 4) {
        fprintf(stderr,"ERROR, no port provided\n"); // deal with wrong port
        exit(1);
    }

    //tworzenie soceketu servera 
    if ((se1_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        error("socket1");   //if socket() return -1 -- error
    }
    if ((se2_sockfd = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1){
        error("socket2");   //if socket() return -1 -- error
    }

    //zero out the structure
    memset( &serv1_addr, 0, sizeof(serv1_addr)); //put zero into structure
    memset( &serv2_addr, 0, sizeof(serv2_addr)); //put zero into structure

    portno1 = atoi(argv[2]); // get port number
    portno2 = atoi(argv[3]);


    serv1_addr.sin_family = AF_INET; // specify address family (IPv4)
    serv1_addr.sin_addr.s_addr = inet_addr("127.0.0.1");
    serv1_addr.sin_port = htons(portno1); // set port number

    serv2_addr.sin_family = AF_INET; // specify address family (IPv4)
    serv2_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); 
    serv2_addr.sin_port = htons(portno2); // set port number

    if(connect(se1_sockfd,(struct sockaddr *) &serv1_addr, sizeof(serv1_addr)) < 0)
        error ("ERROR connecting1"); //if connection failed

    if(connect(se2_sockfd,(struct sockaddr *) &serv2_addr, sizeof(serv2_addr)) < 0)
        error ("ERROR connecting2"); //if connection failed
    while(1) //inf loop
    {
        printf("Please enter the message: "); //write the msg to socket
        bzero(buf, 512); //fill buffer with zeros
        fgets(buf, 512, stdin); //read into buffer



        if( sendto( se1_sockfd, buf, BUFLEN, 0, (struct sockaddr*) &cli1_addr, cli1_len) < 0)
            error ("Error sending1"); 
        if( sendto( se2_sockfd, buf, BUFLEN, 0, (struct sockaddr*) &cli2_addr, cli2_len) < 0)
            error ("Error sending2"); 


        if (recvfrom(se1_sockfd, buf, BUFLEN, 0, (struct sockaddr *) &cli1_addr, &cli1_len) == -1){
            error("recivfrom()1"); //if reciving failed -- error    
        }
        printf("Data: %s\n", buf);

        if (recvfrom(se2_sockfd, buf, BUFLEN, 0, (struct sockaddr *) &cli2_addr, &cli2_len) == -1){
            error("recivfrom()2"); //if reciving failed -- error    
        }
        printf("Data: %s\n", buf);

    }   

    close(se1_sockfd);
    close(se2_sockfd);
    return 0;
} 

Спасибо за вашу помощь.;)

1 Ответ

0 голосов
/ 23 мая 2018

Ваша проблема, вероятно, из-за неинициализированного адреса назначения.sendto() принимает адрес назначения как адрес перед последним аргументом.Но вы пытаетесь указать неинициализированный адрес (например, для recvfrom())

    if( sendto( se1_sockfd, buf, BUFLEN, 0, (struct sockaddr*) &cli1_addr, cli1_len) < 0)
        error ("Error sending1");
                                                                  ^^^
                                                        Try serv1_addr instead ?

Также необходимо указать соответствующий размер.

Еще одна вещь.Пока вы используете sendto() - не нужно выполнять connect().UDP не использует соединение, и connect() устанавливает адрес назначения по умолчанию только для тех, кто собирается использовать send() на таком сокете.Но это не ваш случай, потому что вы предоставляете адрес назначения каждый раз, когда звоните sendto().Более того, вы можете использовать разные адреса каждый раз.

PS Ссылка: sendto ()

...