绑定失败::协议族不支持的地址族 - C.

时间:2015-11-21 02:18:19

标签: c sockets network-programming protocols bind

我在主要功能中声明了struct sockaddr_in server

我将它传递给此函数以返回套接字文件描述符

int openSocket(char* ip_addr, int port, struct sockaddr_in* server){

    int sockfd, len;

    sockfd = socket(AF_INET, SOCK_DGRAM, 0);

    if(sockfd < 0){
        perror("Failed to open socket: ");
        exit(-1);
    }

    len = sizeof(server);
    bzero(server, len);
    server->sin_family= AF_INET;
    inet_pton(AF_INET, ip_addr, &server->sin_addr);
    server->sin_port= htons(port);

    if((bind(sockfd, (struct sockaddr*)&server, len)) < 0){
        perror("Bind failed: ");
        exit(-1);
    }
    return sockfd;

}

使用此调用将结构传递给函数

sockfd = openSocket(vector->ip_addr, vector->port, &server);

但是我收到以下错误。

 Bind failed: : Address family not supported by protocol family

3 个答案:

答案 0 :(得分:4)

  len = sizeof(server);

这决定了指针的大小。你想要它指向的结构的大小,所以这应该是:

  len = sizeof(*server);

答案 1 :(得分:3)

int openSocket(char* ip_addr, int port, struct sockaddr_in* server){
[...]
if((bind(sockfd, (struct sockaddr*)&server, len)) < 0){

server已经被声明为指针,所以我认为是&运算符 bind()来电时不需要。

答案 2 :(得分:0)

$(document).on('keyup change', '.quantity, .price', function() {
    var row = $(this).closest('tr').get(0);
    var rowPrice = $(row).find('.price').val();
    var rowQuantity = $(row).find('.quantity').val();

    $(row).find('.total').val((rowPrice * rowQuantity).toFixed(2));

    $('.total').blur(function () {
        var sum = 0;

        $('.total').each(function() {
            sum += parseFloat($(this).val());
        });

        $('#totals').val((sum).toFixed(2));
    });

});

这很有趣 - 您使用int openSocket(char* ip_addr, int port, struct sockaddr_in* server){ ,它具有您需要设置的以下属性:

  • sockaddr_in - 这必须等于sun_family
  • AF_INET - 这是另一个名为sin_addr unsigned long的结构,您可能希望将其设置为s_addr +
  • INADDR_ANY - 这需要一个需要使用sin_port进行转换的服务器端口。 (确保此端口未使用 ++ !我的首选端口为htons()以进行测试...)

您似乎正在使用3333,但我不确定它对设置inet_pton()的影响是否相同。其他它看起来很好。

另一个方面是这一行可能存在问题:

sin_port

末尾的sockfd = socket(AF_INET, SOCK_DGRAM, 0); 指定[1]:

“指定协议为0会导致socket()使用适用于请求的套接字类型的未指定的默认协议。”

我可以想象一种可能性,即未指定的默认值对您的操作系统不正确或没有默认值。我会尝试0来测试这是否有效。

+注意:这在技术上需要SOCK_STREAM,但我的理解是这对此特定情况无效。

++注意:如果您正在编写客户端和服务器应用程序,请记住要小心哪个拥有该端口。

[1] http://pubs.opengroup.org/onlinepubs/009695399/functions/socket.html