可能导致errno 97(也称为EAFNOSUPPORT或协议不支持的地址类型)的原因

3
我目前正在修改Dennis Bush的UFTP (http://uftp-multicast.sourceforge.net) 以符合我的需求。我目前想要做的是将客户端发送完整信息的地址更改为组播地址。我希望我修改过的UFTP客户端可以组播完整信息,而不是将其单播回服务器,因为我需要多播组中的每个客户端都能够看到发送的完整信息,而不仅仅是服务器。

UFTP的作者告诉我应该修改 client_transfer.c, line 359, nb_sendto() 函数调用的第五个参数 为一个包含我希望发送COMPLETES的专用多播地址和端口的结构体。不幸的是,我遇到了“协议不支持的地址族”错误。代码段原本是这样的:

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

对我来说,这个错误相当模糊。它确切地意味着什么?可能会导致这种错误的原因是什么?有人能指引我正确的方向吗?


1
好的...首先,看起来我正在使用不兼容的类型(in_addr != sockaddr_in)...无论如何,我想了解更多关于errno 97的信息。 - deinocheirus
1个回答

2
如果您向期望 sockaddr 的地方传递了一个 in_addr,问题就在于当系统调用查看它认为是 sockaddr 结构中的地址族时,实际上看到的是组播地址的一个字节之一,这很可能不是有效的地址族。
更详细地解释一下,sockaddr_in 的结构如下:
struct sockaddr_in {
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
}

所以,in_addr 在其前面有一个家族和端口号,而您没有提供这些信息,因此您的地址的第一个字节被视为地址家族。

那么我如何将sockaddr转换为sockaddr_in? - Stasik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接