簡體   English   中英

Unix網絡編程,協議不支持地址族

[英]Unix network programming, Address family not supported by protocol

我正在嘗試使用Unix套接字編寫簡單的程序,我的服務器程序似乎可以工作,但客戶端(幾乎相同)卻不能。 我收到錯誤“協議不支持的地址族”。

實際上,我不確定我是否可以按自己的方式使用它,即僅從兩個終端運行那些程序,但是我看不出這有什么問題。

庫文件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;
}

服務器文件(我猜它可以正常工作,至少沒有錯誤)

#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;
}

客戶端文件,唯一的區別是我使用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;
}

問題是您不初始化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