1

現在、ニーズに合わせてDennis BushのUFTP(http://uftp-multicast.sourceforge.net)を変更しています。私が現在やろうとしているのは、クライアントがCOMPLETEメッセージを送信するアドレスを変更することです。変更したバージョンのUFTPのクライアントに、サーバーにユニキャストするのではなく、COMPLETEメッセージをマルチキャストしてもらいたいのです。これは、マルチキャストグループ内のすべてのクライアントが、送信されたCOMPLETEメッセージだけでなく、サーバ。

UFTPの作成者は、client_transfer.cの359行目、nb_sendto()関数呼び出し、 COMPLETESの送信先のプライベートマルチキャストアドレスとポートを含む構造体の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);

エラーは、私にはかなりあいまいです。正確にはどういう意味ですか?そのようなエラーの考えられる原因は何でしょうか?誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

2

in_addraが期待される場所を通過する場合sockaddr、問題は、システムコールが、sockaddr構造体であると見なすアドレスファミリであると見なすものを調べるときに、マルチキャストアドレスのバイトの1つを実際に認識していることです。おそらく有効なアドレスファミリではありません。

詳細を説明すると、sockaddr_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 に答える