简体   繁体   English

Unix网络编程,协议不支持地址族

[英]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. 我正在尝试使用Unix套接字编写简单的程序,我的服务器程序似乎可以工作,但客户端(几乎相同)却不能。 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: 库文件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 客户端文件,唯一的区别是我使用bind_socket_client而不是bind_socket_server,后来使用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 问题是您不初始化server_address ,而是在连接之前将其添加到客户端中

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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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