简体   繁体   中英

Unix network programming, Address family not supported by protocol

I'm trying to write simple program with Unix sockets, my server program seems to work but client (which is almost the same) don't. I get error "Address family not supported by protocol".

In fact i'm not sure if i can use it the way i do it, namely just run those programs from two terminals, but i can't see what could be wrong with this.

library file network.h:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <sys/types.h>
#include <sys/socket.h>

#include <arpa/inet.h>
#include <netdb.h>


#define PORT_NUMBER_IN  14760
#define PORT_NUMBER_OUT 14761

typedef struct params_socket
{
        int domain_type; /*AF_UNIX lub AF_INET*/
        int link_type; /*SOCK_STREAM połączeniowy SOCK_DGRAM bezpoł. SOCK_RAW bezpośredni*/
        int protocol; /*zero - domyślny, inne w /etc/protocols*/
} params_socket;


typedef enum CONNECTION_TYPE
{
        CLIENT, SERVER
}CONNECTION_TYPE;


int create_socket(params_socket params);
int bind_socket(int my_socket, CONNECTION_TYPE connection_type);
int bind_socket_client(int my_socket);
int bind_socket_server(int my_socket);
struct sockaddr* get_address_structure_in();
struct sockaddr* get_address_structure_out();

int create_socket(params_socket params)
{
        int my_socket = socket(params.domain_type, params.link_type, params.protocol);
        if(0 > my_socket)
        {
                perror("socket");
        }
        return my_socket;
}

int bind_socket(int my_socket, CONNECTION_TYPE connection_type)
{
        int binded_socket = 1;
        struct sockaddr* address_structure;

        if(connection_type == SERVER)
        {
                address_structure = get_address_structure_in();
        }
        else if (connection_type == CLIENT)
        {
                address_structure = get_address_structure_out();
        }

        binded_socket = bind(my_socket, address_structure, sizeof(*address_structure));
        if(0 > binded_socket)
        {
                perror("bind");
        }

        return binded_socket;
}

int bind_socket_server(int my_socket)
{
        return bind_socket(my_socket, SERVER);
}

int bind_socket_client(int my_socket)
{
        return bind_socket(my_socket, CLIENT);
}


struct sockaddr* get_address_structure_in()
{

        struct sockaddr_in* address_structure = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));

        bzero((char *) address_structure, sizeof(*address_structure));
        address_structure->sin_family      = AF_INET;
        address_structure->sin_addr.s_addr = htonl(INADDR_ANY);
        address_structure->sin_port        = htons(PORT_NUMBER_IN);

        return (struct sockaddr*) address_structure;
}

struct sockaddr* get_address_structure_out()
{

        struct sockaddr_in* address_structure = (struct sockaddr_in*) malloc(sizeof(struct sockaddr_in));

        bzero((char *) address_structure, sizeof(*address_structure));
        address_structure->sin_family      = AF_INET;
        address_structure->sin_addr.s_addr = inet_addr("127.0.0.1");
        address_structure->sin_port        = htons(PORT_NUMBER_OUT);

        return (struct sockaddr*) address_structure;
}

server file(i guess it works, at least there are no errors)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "network.h"


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

    params_socket params = {AF_INET, SOCK_STREAM, 0};

    int my_socket;
    int client_socket;
    int binded_socket;

    struct sockaddr_in client_address;
    socklen_t address_size = sizeof(client_address);


    my_socket = create_socket(params);
    binded_socket = bind_socket_server(my_socket);
    printf("socket: %d\nbinded_socket: %d\n", my_socket, binded_socket);


    listen(my_socket, 5);
    client_socket = accept(my_socket, (struct sockaddr *) &client_address, &address_size);
    if(0 > client_socket)
    {
        perror("connection");
    }

    return 0;
}

client file, the only difference is that i use bind_socket_client instead of bind_socket_server, and later use connect

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "network.h"


int main(int argc, char** argv)
{
    params_socket params = {AF_INET, SOCK_STREAM, 0};
    int my_socket;
    int server_socket;
    int binded_socket;

    struct sockaddr_in server_address;
    socklen_t address_size = sizeof(server_address);


    my_socket = create_socket(params);
    binded_socket = bind_socket_client(my_socket);
    printf("socket: %d\nbinded_socket: %d\n", my_socket, binded_socket);


    server_socket = connect(my_socket, (struct sockaddr *) &server_address, address_size);
    if(0 > server_socket)
    {
        perror("connection");
    }

    return 0;
}

The problem is that you don't initialize server_address , add this in the client before connect

memset(&server_address, 0, sizeof(server_address));

server_address.sin_family = AF_INET;
server_address.sin_addr.s_addr = inet_addr("127.0.0.1");
server_address.sin_port = htons(PORT_NUMBER_IN);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM