Ошибка привязки/отправки сокета UDP (DGRAM)

Я новичок в сокетах UDP, раньше работал с TCP. Кажется, мой клиент не может подключиться к моему серверу, но я не знаю, в чем проблема.

Когда я запускаю свой сервер, все работает нормально. Компилируется и запускается без проблем и ждет сообщения от клиента.

С другой стороны, клиент дает сбой, компилируется без проблем, но во время выполнения выдает мне ошибку при связывании(). Я видел в других местах, что привязка не всегда необходима, поэтому я также пытаюсь удалить ее, но когда я это делаю, появляется ошибка в sendto(). Я использую perror(), чтобы попытаться найти проблему. В bind сообщение «Адрес уже используется», а в sendto — «Семейство адресов не поддерживается протоколом».

Не знаю, неправильный ли мой подход. Я пробовал несколько способов сделать это, но ничего не работает. Любая помощь будет принята с благодарностью.

Код сервера:

int main (){
    int sockfd, newsockfd;
    int portno;
    socklen_t tamcli;
    struct sockaddr_in dest, sa;
    char* mensaje;

    bzero((char *) &dest, sizeof(dest));
    portno = 5001;
    mensaje = (char*)malloc(sizeof(char)*100);

    sockfd = socket(PF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0){
        printf("ERROR al abrir socket\n");
        perror("sockto");
        exit(1);
    }

    dest.sin_family = AF_INET;
    dest.sin_port = htons(portno);
    dest.sin_addr.s_addr = INADDR_ANY;
    tamcli = sizeof(sa);

    if (bind(sockfd, (struct sockaddr *) &dest, sizeof(dest)) < 0){
        printf("ERROR en enlazar\n");
        perror("bind");
        exit(1);
    }


    newsockfd = recvfrom(sockfd, mensaje, sizeof(mensaje), 0,(struct sockaddr *)&sa, &tamcli);
    if (newsockfd < 0){
        printf("ERROR en aceptar el mensaje\n");
        perror("recvfrom");
        exit(1);
    }

    printf("El mensaje del cliente fue: %s\n", mensaje);

    close(sockfd);
}

Код клиента:

int main (){
    int sockfd, newsockfd;
    int portno;
    socklen_t tamcli;
    struct sockaddr_in dest, sa;
    char* mensaje;

    bzero((char *) &dest, sizeof(dest));
    portno = 5001;
    mensaje = (char*)malloc(sizeof(char)*100);
    tamcli = sizeof(sa);

    mensaje = "Hola";

    sockfd = socket(PF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0){
        printf("ERROR al abrir socket\n");
        perror("socket");
        exit(1);
    }

    dest.sin_family = AF_INET;
    dest.sin_port = htons(portno);
    if (inet_aton("127.0.0.1", &dest.sin_addr) == 0){
        printf("Error conectandose a la direccion");
        perror("inet_aton");
        exit(1);
    }

    if (bind(sockfd, (struct sockaddr *) &dest, sizeof(dest)) < 0){
        printf("ERROR en enlazar\n");
        perror("bind");
        exit(1);
    }


    newsockfd = sendto(sockfd, mensaje, sizeof(mensaje), 0, (struct sockaddr *) &sa, tamcli);
    if (newsockfd < 0){
        printf("ERROR en enviar el mensaje\n");
        perror("sendto");
        exit(1);
    }

    close(sockfd);
}

person aponcedeleonch    schedule 07.09.2014    source источник
comment
Адрес, который уже используется, обычно означает, что порт, который вы пытаетесь использовать, уже занят.   -  person G-Man    schedule 07.09.2014
comment
Взгляните на эти примеры сервера и клиента udp cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/ и cs.ucsb.edu/~almeroth/classes/W01.176B/hw2/examples/   -  person G-Man    schedule 07.09.2014
comment
@Gaetano спасибо, примеры мне очень помогли   -  person aponcedeleonch    schedule 10.09.2014
comment
@Gaetano действительно, это было все   -  person aponcedeleonch    schedule 10.09.2014
comment
Рад, что смог помочь другу   -  person G-Man    schedule 10.09.2014


Ответы (1)


Вы не можете привязываться к одному и тому же порту (на одном компьютере) как в клиентской, так и в серверной программах — только одна из них может владеть этой конечной точкой.

Также ваши аргументы для sendto() выглядят неправильно, они определяются как:

 ssize_t sendto(int s, const void *msg, size_t len, int flags,
                const struct sockaddr *to, socklen_t tolen);
person John Hascall    schedule 07.09.2014
comment
Извините за мой поздний ответ.. да, это был порт.. я не заполнил правильную структуру, чтобы получить соединение с сервером.. я заполнил пункт назначения, и это должно было быть sa... я изменил его, и это сработало в совершенстве - person aponcedeleonch; 10.09.2014