1

我目前正在修改 Dennis Bush 的 UFTP ( http://uftp-multicast.sourceforge.net ) 以满足我的需要。我目前正在尝试做的是更改客户端发送 COMPLETE 消息的地址。我希望我的 UFTP 修改版本的客户端多播 COMPLETE 消息,而不是将其单播回服务器,因为我需要多播组中的每个客户端都能够看到发送的 COMPLETE 消息,而不仅仅是服务器。

UFTP 的作者告诉我,我应该修改client_transfer.c,第 359 行,nb_sendto() 函数调用,第 5 个参数到一个包含私有多播地址和我希望将 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);

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

4

1 回答 1

2

如果您传递的是预期的in_addra sockaddr,那么问题很简单,当系统调用查看它认为是 sockaddr 结构中的地址族时,它实际上看到的是多播地址的一个字节,即大概不是一个有效的地址族。

为了解释更多, asockaddr_in看起来像这样:

struct sockaddr_in {
    sa_family_t sin_family;
    in_port_t sin_port;
    struct in_addr sin_addr;
}

所以in_addr在它之前有一个您没有提供的系列和端口号,而是您的地址的第一个字节被视为地址系列。

于 2012-11-19T11:10:40.670 回答