Download presentation
Presentation is loading. Please wait.
1
第11回ネットワークプログラミング 中村 修
2
今日のお題 講義 ---------休憩-------------------------------- 実習:ミニプロを作る&相談タイム
IPv6 IPv6概要 プロトコルの独立性 練習1:getaddrinfo 休憩 実習:ミニプロを作る&相談タイム 19:30まで
3
IPv4アドレスとIPv6アドレス IPv4アドレス32bit IPv6アドレス128bit
4
133. 27. 4. 212 IPv4アドレス アドレスの数は2の32乗(約42億) IPアドレスの表記 32bits
世界の人口の数より少ない(約64億) アドレスはコンピュータだけ!? IPアドレスの表記 32bits
5
IPv6アドレス アドレスの数は2の128乗(約340澗(カン))(340,282,366,920,938,463,463,374,607,431,768,211,456 ) 1人あたり5垓(ガイ)個 アドレスはコンピュータ以外のものにも使える IPアドレスの表記 128bit を 16進数で表す 4桁(16bit)ごとに 「 : (コロン)」 で区切る 3ffe:501:100c:e320:2e0:18ff:fe98:936d
6
階層的なプロトコル設計 transport layer IPv4 network layer data link layer process
TCP UDP transport layer ICMP IPv4 IGMP network layer ARP RARP data link layer hardware interface media
7
階層的なプロトコル設計 transport layer IPv6 network layer data link layer process
TCP UDP transport layer ICMP IPv6 IGMP network layer ARP RARP data link layer hardware interface media
8
IPv4とIPv6のプログラミングの違い IPv4の時は 以下の構造体のメンバの情報を 以下の関数を用いて集め 以下のように使っていた
struct hostent *hp; struct sockaddr_in servaddr; 以下の関数を用いて集め hp = gethostbyname(hostname)); 以下のように使っていた connect(sockfd, (struct sockaddr *) &servaddr, sizeof(servaddr));
9
IPv6、IPv4両方に対応するには 以下の構造体のメンバの情報を 以下の関数を用いてあつめ 以下のように使う
struct addrinfo hints, *ai ; 以下の関数を用いてあつめ getaddrinfo(hostname, port, &hints, &ai)); 以下のように使う socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); connect(socketfd, ai->ai_addr, ai->ai_addrlen) ;
10
addrinfo構造体 <netdb.h> struct addrinfo {
int ai_flags; /* AI_PASSIVE, AI_CANONNAME */ int ai_family; /* PF_xxx */ int ai_socktype; /* SOCK_xxx */ int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ size_t ai_addrlen; /* length of ai_addr */ char *ai_canonname; /* canonical name for hostname */ struct sockaddr *ai_addr; /* binary address */ struct addrinfo *ai_next; /* next structure in linked list */ };
11
getaddrinfo getaddrinfo(const char *nodename,
const char *servname, const struct addrinfo *hints, struct addrinfo **res); nodename=ホスト名, servname=ポート, hintsは情報のタイプに関するヒント, resは結果のaddrinfoのリストが格納される 返り値:成功すると 0 を返し、失敗すると以下の非 0 のエラーコードのいずれかを返す。 サーバの場合は nodenameはNULL hintsにAI_PASSIVEフラグを設定する
12
getaddrinfoの取り扱い方 複数のアドレスが戻ってくる(RFC2553) 帰って来る順番はDNSの実装に依存
帰ってきたそれぞれに対してconnectしてみる for(ai = ai_save; ai != NULL; ai->ai_next){ sockfd = socket(ai->ai_family, ai->ai_socktype,ai->ai_protocol); if(sockfd < 0){continue;} if(connect(sockfd, ai->ai_addr, ai->ai_addrlen)){ break;} close(sockfd); }
13
freeaddrinfo void freeaddrinfo(struct addrinfo *ai)
getaddrinfoで動的に割り当てられた領域を開放する
14
gaistrerror char * gai_strerror(int ecode);
getaddrinfoの返り値のエラーコードを人間に可読な文字列に変換する
15
練習:getaddrinfoに慣れよう 入手し、コンパイルして、読む 次にgetaddrinfoだけをしたサンプルソースを
まず、以下のソース(IPv4版echoクライアント)を 入手し、コンパイルして、読む /home/kaizaki/osamuNP/11/echo_client_v4.c 次にgetaddrinfoだけをしたサンプルソースを /home/kaizaki/osamuNP/11/getaddrinfo.c 最後に、echoクライアントをIPv6対応にしてみよう!
16
練習ヒント(というか答え) 一応、答えは以下に(エラー処理もあり版) 両方のサンプルソースのコメント部をよく見ると、、、
どこから、どこまで変更すればいいか書いてある。。。 一応、答えは以下に(エラー処理もあり版) /home/kaizaki/osamuNP/11/echo_client.c
Similar presentations
© 2024 slidesplayer.net Inc.
All rights reserved.