C 协议不支持errno 97 aka EAFNOSUPPORT aka地址系列的可能原因

C 协议不支持errno 97 aka EAFNOSUPPORT aka地址系列的可能原因,c,linux,sockets,network-programming,C,Linux,Sockets,Network Programming,我目前正在修改丹尼斯·布什的UFTP(),以满足我的需要。我目前正在尝试更改客户端发送完整消息的地址。我希望修改后的UFTP版本的客户端能够多播完整的消息,而不是将其单播回服务器,因为我需要多播组中的每个客户端都能够看到发送的完整消息,而不仅仅是服务器 UFTP的作者告诉我,我应该将client_transfer.c,第359行,nb_sendto()函数调用,第5个参数修改为一个包含私有多播地址和我希望向其发送数据的端口的结构。不幸的是,我得到了“协议不支持的地址族”错误。代码部分最初是这样的

我目前正在修改丹尼斯·布什的UFTP(),以满足我的需要。我目前正在尝试更改客户端发送完整消息的地址。我希望修改后的UFTP版本的客户端能够多播完整的消息,而不是将其单播回服务器,因为我需要多播组中的每个客户端都能够看到发送的完整消息,而不仅仅是服务器

UFTP的作者告诉我,我应该将client_transfer.c,第359行,nb_sendto()函数调用,第5个参数修改为一个包含私有多播地址和我希望向其发送数据的端口的结构。不幸的是,我得到了“协议不支持的地址族”错误。代码部分最初是这样的:

 if (nb_sendto(listener, outpacket, payloadlen, 0,
               (struct sockaddr *)&group_list[listidx].replyaddr,
               sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
        sockerror(group_list[listidx].group_id, group_list[listidx].file_id,
                "Error sending COMPLETE");
    } else {
        log(group_list[listidx].group_id, group_list[listidx].file_id,
                "COMPLETE sent");
    }
    set_timeout(listidx);

    free(buf);
    free(encrypted);
if (nb_sendto(listener, outpacket, payloadlen, 0,
      ////modified line:
              (struct in_addr *)&group_list[listidx].multi.s_addr, //struct in_addr multi;
      ////end of modified line
               sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
        sockerror(group_list[listidx].group_id, group_list[listidx].file_id,
                "Error sending COMPLETE");
    } else {
        log(group_list[listidx].group_id, group_list[listidx].file_id,
                "COMPLETE sent");
    }
    set_timeout(listidx);

    free(buf);
    free(encrypted);
struct sockaddr_in {
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
}
我当前的代码如下所示:

 if (nb_sendto(listener, outpacket, payloadlen, 0,
               (struct sockaddr *)&group_list[listidx].replyaddr,
               sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
        sockerror(group_list[listidx].group_id, group_list[listidx].file_id,
                "Error sending COMPLETE");
    } else {
        log(group_list[listidx].group_id, group_list[listidx].file_id,
                "COMPLETE sent");
    }
    set_timeout(listidx);

    free(buf);
    free(encrypted);
if (nb_sendto(listener, outpacket, payloadlen, 0,
      ////modified line:
              (struct in_addr *)&group_list[listidx].multi.s_addr, //struct in_addr multi;
      ////end of modified line
               sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
        sockerror(group_list[listidx].group_id, group_list[listidx].file_id,
                "Error sending COMPLETE");
    } else {
        log(group_list[listidx].group_id, group_list[listidx].file_id,
                "COMPLETE sent");
    }
    set_timeout(listidx);

    free(buf);
    free(encrypted);
struct sockaddr_in {
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
}

对我来说,这个错误相当模糊。这到底是什么意思?这种错误的可能原因是什么?有人能给我指出正确的方向吗?

如果您在_addr中传递一个
,其中一个
sockaddr
是预期的,那么问题很简单,当系统调用查看它认为是sockaddr结构中的地址族时,它确实看到了多播地址的一个字节,这可能不是一个有效的地址族

为了进一步解释,在
中的
sockaddr\u如下所示:

 if (nb_sendto(listener, outpacket, payloadlen, 0,
               (struct sockaddr *)&group_list[listidx].replyaddr,
               sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
        sockerror(group_list[listidx].group_id, group_list[listidx].file_id,
                "Error sending COMPLETE");
    } else {
        log(group_list[listidx].group_id, group_list[listidx].file_id,
                "COMPLETE sent");
    }
    set_timeout(listidx);

    free(buf);
    free(encrypted);
if (nb_sendto(listener, outpacket, payloadlen, 0,
      ////modified line:
              (struct in_addr *)&group_list[listidx].multi.s_addr, //struct in_addr multi;
      ////end of modified line
               sizeof(struct sockaddr_in)) == SOCKET_ERROR) {
        sockerror(group_list[listidx].group_id, group_list[listidx].file_id,
                "Error sending COMPLETE");
    } else {
        log(group_list[listidx].group_id, group_list[listidx].file_id,
                "COMPLETE sent");
    }
    set_timeout(listidx);

    free(buf);
    free(encrypted);
struct sockaddr_in {
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
}

因此,地址中的
前面有一个您没有提供的系列和端口号,而您的地址的第一个字节被视为一个地址系列。

。。。首先,看起来我使用的是不兼容的类型(in_addr!=sockaddr_in)。。。不管怎样,我想知道更多关于errno 97的信息,那么我如何在中从sockaddr转换到sockaddr_呢