UDP - Ошибка в sendto (): семейство адресов не поддерживается протоколом - PullRequest
0 голосов
/ 26 августа 2018

Следующий код является примером программирования для использования сокетов UDP.

Существует 3 .c исходных файла (Client_UDP.c, Server_UDP.c и Message_UDP.c) и заголовочный файл 1 .h (Prototype.h).

Я хочу, чтобы сервер и клиент связывались друг с другом только через функции в Message_UDP.

Ход событий вроде бы такой:

  1. Клиент отправляет первый пакет / сообщение на Сервер.
  2. Сервер получает пакет от Клиента.
  3. Сервер пытается отправить пакет ответов, но выдает ошибку: "Error in sendto(): Address family not supported by protocol".

Кто-нибудь знает почему? Как я могу решить это?

Client_UDP.c

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

#include "Prototype.h"

int main(int argc, char * argv[]) {

    int fd_socket;

    struct sockaddr_in server;      
    socklen_t length_server = sizeof (server);

    fd_socket = socket(AF_INET, SOCK_DGRAM, 0);
    Error_A(fd_socket, "Error in socket()");

    server.sin_port = htons(8888);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = inet_addr("127.0.0.1");

    // send packet to server
    function_SEND(fd_socket, server, length_server, "CLIENT");

    // receive packet from server
    function_RECEIVE(fd_socket, server, length_server, "CLIENT");

    close(fd_socket);
    return EXIT_SUCCESS;
}

Server_UDP.c

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

#include "Prototype.h"

int main(int argc, char * argv[]) {

    int fd_socket;
    int rv; // return value

    struct sockaddr_in server;
    struct sockaddr_in client;

    socklen_t length_server = sizeof (server);
    socklen_t length_client = sizeof (client);

    fd_socket = socket(AF_INET, SOCK_DGRAM, 0);
    Error_A(fd_socket, "Errore in socket()");

    server.sin_port = htons(8888);
    server.sin_family = AF_INET;
    server.sin_addr.s_addr = INADDR_ANY;

    rv = bind(fd_socket, (struct sockaddr *) &server, length_server);
    Error_A(rv, "Error in bind()");

    // receive packet from client
    function_RECEIVE(fd_socket, client, length_client, "SERVER");

    // send packet to client
    function_SEND(fd_socket, client, length_client, "SERVER");

    close(fd_socket);
    return EXIT_SUCCESS;
}

Message_UDP.c

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

#include "Prototype.h"

void Error_A(int return_value, char *error_message) {

    if (return_value < 0) {
        perror(error_message);
        exit(EXIT_FAILURE);
    }
}

void function_SEND(int fd_socket, struct sockaddr_in host, int length_host, char *sender) {

    int rv; // return value
    char packet[100] = "PACKET";

    // send packet
    rv = sendto(fd_socket, packet, 100, 0, (struct sockaddr *) &host, length_host);
    Error_A(rv, "Error in sendto()");
    printf("<%s> -- package sent: <%s> \n", sender, packet);
}

void function_RECEIVE(int fd_socket, struct sockaddr_in host, int length_host, char* receiver) {

    int rv; // return value
    char packet[100] = "";

    // receive packet
    rv = recvfrom(fd_socket, packet, 100, 0, (struct sockaddr *) &host, &length_host);
    Error_A(rv, "Errore in recvfrom()");
    printf("<%s> -- packet received: <%s> \n", receiver, packet);
}

Prototype.h

void Error_A(int return_value, char *error_message);

void function_SEND(int fd_socket, struct sockaddr_in host, int length_host, char *sender);

void function_RECEIVE(int fd_socket, struct sockaddr_in host, int length_host, char* receiver);

Это вывод клиента:

КЛИЕНТ - посылка отправлена: ПАКЕТ

Это вывод сервера:

СЕРВЕР - посылка получена: ПАКЕТ

Ошибка в sendto (): семейство адресов не поддерживается протоколом

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Я добавляю эту структуру в Prototype.h :

struct Host {
    struct sockaddr_in host;
    socklen_t length_host;
} host_return;

void Error_A(int return_value, char *error_message);

void function_SEND(int fd_socket, struct sockaddr_in host, int length_host, char *sender);

struct Host function_RECEIVE(int fd_socket, struct sockaddr_in host, int length_host, char* receiver);

Изменение function_RECEIVE () в Message_UDP.c сэто:

struct Host function_RECEIVE(int fd_socket, struct sockaddr_in host, int length_host, char* receiver) {

    int rv; // return value
    char packet[100] = "";

    // receive packet
    rv = recvfrom(fd_socket, packet, 100, 0, (struct sockaddr *) &host, &length_host);
    Error_A(rv, "Errore in recvfrom()");
    printf("%s -- packet received: %s \n", receiver, packet);

    host_return.host = host;
    host_return.length_host = length_host;

    return host_return;
}

и код в Server_UDP.c поместите это:

// receive packet from client
host_return = function_RECEIVE(fd_socket, client, length_client, "SERVER");

// send packet to client
function_SEND(fd_socket, host_return.host, host_return.length_host,"SERVER");

вместо

// receive packet from client
function_RECEIVE(fd_socket, client, length_client, "SERVER");

// send packet to client
function_SEND(fd_socket, client, length_client, "SERVER");

, кажется,работать, потому что вывод (но я надеюсь, что мне просто не повезло):

CLIENT - пакет отправлен: PACKET

CLIENT - пакет получен: PACKET

сервер:

СЕРВЕР - полученный пакет: ПАКЕТ

СЕРВЕР - отправленный пакет: ПАКЕТ

0 голосов
/ 26 августа 2018

Я могу упустить что-то очевидное.Вот что я заметил.В вашем Server_UDP.c инициализация для клиента отсутствует.Я вижу объявление struct sockaddr_in client; , но назначения нет.Здесь я бы предположил, что клиенту будет присвоен тот же номер порта и IP-адрес обратной связи, как показано ниже:

client.sin_port = 8888;
client.sin_family = AF_INET;
client.sin_addr.s_addr = inet_addr("127.0.0.1");

Это может быть причиной неудачной отправки на сервере

...