1

Cを使用して構築されたIPv6ネットワークアプリケーションに取り組んでいます.

ここで、要件に従って、パケットのデフォルト アドレスにシステムのリンク ローカル アドレスを入力する必要があります。

glibc目的のために利用できる関数/ライブラリはありますか。

コマンドを使用してこれをsystem実行し、システムからアクセスできるスクリプトを実行できることはわかっていifcfg-eth0ますが、それはお勧めできません。

私はこのソケットのすべてに慣れていないので、些細なことを見逃していたらすみません。

編集 :

OS:リナックス

これは実際には、sendip生の C ソケット プログラミングを使用して構築されたオープン ソースの実装です。今、私はそれを修正しています。私の要件に。

http://snad.ncsl.nist.gov/ipv6/sendip.html

4

2 に答える 2

2

私はそれを理解しました..... 実は私はそうではありませんでした.このブログは実際に私を助けたものです. 彼のアドバイスにとても感謝しています。

http://valileo-valilei.blogspot.in/2010/09/getting-link-local-addres-from.html

これが実装です:(同様の状況で立ち往生している可能性のある他の多くの人を助ける可能性があるため、ここでコードを提供しています)

コード:

 #include "sys/types.h"
 #include "ifaddrs.h"
 #include <arpa/inet.h>
 #include <stdio.h>
 #include <malloc.h>
 #include <string.h>

 int get_link_local_addr(char* if_name, int if_name_length, 
                      struct sockaddr_in6 *ip) {

    struct ifaddrs *ifaddr, *ifa;
    int ret = -2;

    if (getifaddrs(&ifaddr) == -1) {
            perror("getifaddrs");
            ret = -1;
            freeifaddrs(ifaddr);
            return ret;
    }

    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
            if (ifa->ifa_addr->sa_family != AF_INET6) continue;

            if (strncmp(ifa->ifa_name, if_name, if_name_length)) continue;

            struct sockaddr_in6 *current_addr =
                                    (struct sockaddr_in6 *) ifa->ifa_addr;

            if (!IN6_IS_ADDR_LINKLOCAL(&(current_addr->sin6_addr))) continue;

            memcpy(ip, current_addr, sizeof(*current_addr));
            ret = 0;
    }

    freeifaddrs(ifaddr);
    return ret;
  }


  int main() {

  struct sockaddr_in6 *sa=(struct sockaddr_in6 *)malloc(40);
  char *src,dst[INET6_ADDRSTRLEN];

  get_link_local_addr("wlan0",5,sa);

  inet_ntop(AF_INET6, &(sa->sin6_addr), dst, INET6_ADDRSTRLEN);

  printf("Link Layer Address is : %s\n",dst);

  return 0;

 }

出力:

Link Layer Address is : fe80::d2df:9aff:fe56:917d

コマンドラインでのクロスチェック:

  $ ifconfig wlan0
  wlan0
      Link encap:Ethernet  HWaddr d0:df:9a:56:91:7d  
      inet addr:172.31.9.171  Bcast:172.31.255.255  Mask:255.255.0.0
      inet6 addr: 2001:df0:92:0:d2df:9aff:fe56:917d/64 Scope:Global
      inet6 addr: fe80::d2df:9aff:fe56:917d/64 Scope:Link
      inet6 addr: 2001:df0:92:0:50df:d286:a281:e6c0/64 Scope:Global
      UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
      RX packets:217235 errors:0 dropped:0 overruns:0 frame:0
      TX packets:21173 errors:0 dropped:0 overruns:0 carrier:0
      collisions:0 txqueuelen:1000 
      RX bytes:31550379 (31.5 MB)  TX bytes:4062945 (4.0 MB)
于 2013-01-21T12:59:52.437 に答える
0

IPv6 アプリがある場合は、IPv6 API (ソケットなど) があります。

この API には、システムのリンク ローカル アドレスを取得する機能が必要です。

マルチホーミングに注意。

于 2013-01-21T10:30:03.463 に答える