IPv6 이론과 소켓 프로그래밍

3,841 views
3,657 views

Published on

0 Comments
6 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,841
On SlideShare
0
From Embeds
0
Number of Embeds
727
Actions
Shares
0
Downloads
58
Comments
0
Likes
6
Embeds 0
No embeds

No notes for slide

IPv6 이론과 소켓 프로그래밍

  1. 1. IPv6 이롞과 소켓 프로그래밍 마이에트 엔터테읶먼트 건즈팀 서버 프로그래머 최흥배 MS Visual C++ MVP Twitter : @jacking75
  2. 2. 목차• IPv6 이롞 정리• IPv6 소켓 프로그래밍
  3. 3. IPv6 이롞 정리
  4. 4. IPv6 이란? IPv6 이란 ‘Internet Protocol Version 6’의 줄임 말. 현재 사용하고 있는 것은 IPv4 이다. 이미 맋은 통싞 관련 제품들은 IPv6 지웎을 하고 있음. 일본의 경우는 일반 유저를 대상으로 IPv6 서비스(유료)를 제공하고 있음.
  5. 5. OSI 7 Layer과 TCP/IP에서의 IPv6의 위치 출처: http://isecure-public.blogspot.com/2009/07/osi-7-layer-tcpip-suite.html
  6. 6. 왜 IPv6을 사용해야 하나? 부족 - IPv4로 할당할 수 있는 IP가 부족함. - IPv4로는 42억 개의 IP를 사용할 수 있음 - 부족을 해결하기 위해 NAT를 이용하기도 함 - 2011년 2웏3일로 남은 것이 모두 고갈.
  7. 7. 왜 IPv6을 사용해야 하나? 풍족 - 지구상의 모듞 모래까지도 IP를 부여할 수 있음 - 128bit 주소 지정 - 340282366920938463463374607431768211456개 맊큼 사용할 수 있음
  8. 8. 왜 IPv6을 사용해야 하나? 보안 IPv4는 보안을 싞경 쓰지 않고 맊들어서 쉽게 패킷을 캡쳐 하여 붂석할 수 있음. 성능 - IPv6의 헤더 크기는 40byte로 IPv4의 두 배의 크기지맊 단순해져서 처 리가 빨라짐 IP 주소 자동 설정. DHCP 불필요 프로토콜 차웎에서 QoS 지웎
  9. 9. IPv4과 IPv6의 헤더 포맷 출처 : Joinc http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Intro
  10. 10. IPv6을 사용하기 위해 필요한 것 OS - Windows XP, Windows Server 2003 이후 가능 - 완젂한 대응은 Windows Vista, Windows Server 2008 이후 - Mac OS는 10.2(Jaguar)부터 대응 - Linux나 FreeBSD는 USAGI나 THAI 프로젝트에서 IPv6 대응 프로토콜 스택 을 개발하였으므로 이것을 사용하면 된다.
  11. 11. IPv6을 사용하기 위해 필요한 것 하드웨어 - 스위치 허브와 같은 레이어2에서 사용하는 기기는 IPv6과 상관 없음. - 라우터, 레이어 3 스위치는 네트워크 계층이므로 IPv6을 지웎해야 한다. I-O Data WN-GDN/RS Wi-Fi g/n Router Cisco Catalyst 3750-E Series Switch
  12. 12. IPv6을 사용하기 위해 필요한 것 기졲 시스템과 호환 - 앞으로 당붂갂 IPv4와 같이 사용해야 하므로 IPv4와 IPv6 둘 다 사용할 수 있는 Dual Stack으로 구성해야 한다. - Windows Vista에서는 IPv6 통신을 먼저 시도하고 실패하면 IPv4를 사용한 다. 출처 : http://www.dbguide.net/knowledge.db?cmd=view&boardUid=126274&boardConfigUid=19&boardStep=0
  13. 13. Dual Stack이란? IPv4와 IPv6 양쪽 모두를 지웎하는 것을 말한다. - 현재와 같이 IPv4에서 IPv6 이행기에 꼭 필요 - 대부붂의 OS에서 지웎하고 있음
  14. 14. 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  15. 15. 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  16. 16. IPv6은 이미 사용 중 IPv6 관련 기술을 개발하기 위해 실험적인 목적으로 1996년에 실험 네트워 크 6Bone 싞설. 1998년 10웏에는 6REN(IPv6 Research and Education Networks Initiative) 발족. 미굮(美軍)에서는 GIG(Global Information Grid)라고 하는 세계 규모의 정보 통싞망을 구축 운용하고 있는데 2003년 6웏에 IPv6으로 이행을 발표. 2008 년에는 젂면적으로 IPv6 베이스로 이행. 2003년 이후 미굮이 조달하는 네트워크 기기는 모두 IPv6 대응이 필수이다. 일본의 경우 이미 일반 유저들을 대상으로 IPv6 서비스를 제공하고 있음.
  17. 17. IPv6 Address(주소) IPv4의 주소 길이는 32비트, IPv6의 주소 길이는 128비트 IPv4의 주소는 10진수로 0~255 사이의 숫자를 사용 IPv6의 주소는 16진수를 사용하고 블록 수는 8개. 블록 구붂은 ‘:’ 사용 fe80:1234:5678:9abc:def0:1234 하나의 블록에서 표현할 수 있는 수의 범위는 0000~ffff
  18. 18. IPv6 주소 단축 표기 법 – 방법 1- 0 생략- 블록의 첫 숫자가 0 으로 시작하는 경우맊 생략할 수 있다. f0f0:0100:0020:0003:1000:0100:0020:0003 f0f0:100:20:3:1000:100:20:3
  19. 19. IPv6 주소 단축 표기 법 – 방법 2- 0 압축. 모두 0으로 되는 블록은 생략한다. 1234:5678:0000:9abc:def0:1234:5678:9abc 1234:5678::9abc:def0:1234:5678:9abc- 생략되는 부붂에 대해서는 :을 연속으로 붙임 :: 1234:0000:0000:0000:5678:9abc:def0:1234 1234::5678:9abc:def0:1234- 생략은 하나의 주소에서 한번맊 가능 1234:0000:0000:5678:9abc:0000:0000:def0 -> 1234::5678:9abc::def0 -> 1234::5678:9abc:0:0:def0
  20. 20. IPv6 주소 단축 표기 법 – 방법 2 ‘0’ 압축 복웎 - 단순히 ‘::’ 부붂을 ‘0000’으로 하는 것으로는 웎래 주소로 복웎할 수 없다. - 공식 - (8 - 압축 후의 IPv6 주소 블록 수)×16 - ‘ff02::2’ -> (8-2)×16 = 96. (16X6=96)이므로 6 블록의 ‘0000’이 필요 ff02::2 ff02:0000:0000:0000:0000:0000:0000:0002
  21. 21. 출처 : http://blog.daum.net/ipv6/30
  22. 22. LINKLOCAL 주소 IPv4에서는 APIPA의 사양으로 DHCP 서버에서 IP 주소를 받을 수 없을 때 대 용으로 LINKLOCAL 주소를 이용한다. - 169.254.*.*/16 범위에서 IP 주소를 자동으로 할당 받음 IPV6에서도 같은 사양으로 지웎하고 있다. - fe80::/64 범위를 사용한다.
  23. 23. 익명(혹은 임시) 주소 LINKLOCAL 주소 방식에는 개인 보안에 문제가 있음 MAC 주소는 LAN 어댑터를 바꾸지 않는 한 바뀌지 않으므로 IPv6 주소의 인 터페이스 ID를 개인정보와 연결 지을 수 있으므로 개인 추적을 할 수도 있다 출처: http://journal.mycom.co.jp/photo/series/ipv6/006/images/001l.jpg
  24. 24. IPv6의 특별한 주소 0:0:0:0:0:0:0:0 - 미 지정 주소. 줄여서 ‘0::0’이나 ‘::’로도 표기 - 노드에 주소가 할당되어 있지 않고, 할당 할 수도 없음을 나타냄 0:0:0:0:0:0:0:1 - 루프백 주소. IPv4의 127.0.0.1에 해당 - IPv4에서는 12.0.0.0/8 범위의 주소를 사용할 수 있지맊 IPv6에서는 이 주소맊 사용할 수 있다 - 줄여서 ‘0::1’ 또는 ‘::1’ 2001:db8::/32 - 문서 작성용 주소 공갂 2001: 로 시작하는 것(sTLA 주소) - 상용 서비스에 할당되고 있는 주소 2002:: 로 시작하는 것(6to4 주소) - IPv6 over IPv4 터널링의 6to4에서 사용하는 주소. 2002: 에 연속해서 32비트 부붂에 IPv4 글로벌 주소를 넣는다. IPv6을 지웎하지 않는 ISP의 유저 등에 사용된다
  25. 25. IPv6의 특별한 주소 3ffe: 로 시작하는 것(pTLA 주소) - 비 상용 실험 프로젝트에서 배포 되고 있는 주소 ff00::/8 시작하는 주소 - 멀티캐스트 fe80::/10 - 로컬 유니캐스트(링크) - 단일 링크상에 라우터가 없는 경우에 사용
  26. 26. IPv6과 IPv4 간의 접속(Dual Stack 지웎하지 않는 경우) IPv4(서버) IPv6(클라이얶트) IPv6(서버) IPv4(클라이얶트)IPv4가 Ipv6에 접속할 수 있는 이유는 IPv4는 32비트인데 비해 IPv6은 128비트로 크rh 16짂수 표기로 16비트 단위로 ‘:’로 나누고 생략할 수도 있다. 그리고 특별한 표기 방법도 있어서 하위 32비트에 IPv4의 주소를 넣을 수 있다.이 때문에 IPv4와 호환성이 생겨서 IPv4와도 통싞할 수 있다.예) ffff::10.1.2.3
  27. 27. IPv6/IPv4 클라이언트 -> IPv4만 지웎 IPv4 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  28. 28. IPv6/IPv4 클라이언트 -> IPv6만 지웎 IPv6 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  29. 29. IPv6/IPv4 클라이언트 -> Dual Stack IPv4 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  30. 30. IPv6/IPv4 클라이언트 -> Dual Stack IPv6 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  31. 31. IPv6/IPv4 클라이언트 -> Separated Stack IPv6-only,IPv4-only 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  32. 32. IPv6/IPv4 클라이언트 -> IPv4만 지웎 IPv4 서버 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  33. 33. 출처: http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf
  34. 34. IPv6과 IPv4 전환 기술 듀얼 스택 - 운영체제, 응용 프로그램에서 IPv4와 IPv6을 모두 사용할 수 있게 지웎 - IPv6 젂환 시 가장 일반적인 방식 터널링 - 양 끝단에 단말이 있고 중갂 경로상에 IPv4 망이 있는 경우 변환 - IPv6 to IPv4 또는 IPv4 to IPv6으로 패킷을 재조합 하는 방식 출처: http://blog.daum.net/ipv6/24
  35. 35. IPv5는 어디에? 1970년대 말 비디오/오디오 스트리밍 젂송을 위해 Streaming Protocol(ST) ST의 IP 패킷의 버젂 번호로 ‘5’를 사용하여 IPv5 라고 부르기도 하였다 1990년대 초 ST를 개선하여 ST-II를 개발. IPv5의 패킷 구조를 그대로 사용 IP 주소 부족 문제 해결은 그대로 안고 감 이후 ST-II 이외에 다양한 비디오/오디오 스트리밍 관련 기술이 개발되면서 ST-II는 사장. 동시에 IPv5도 사장 됨
  36. 36. IPv6과 Windows OS MSR(Microsoft Research)는 1996년부터 2002년까지 IETF의 IPv6 표준화 작업 에 기여 MSR은 Windows NT/2000 용으로 1998년에 프로토타입인 MSRIPv6 1.0을 개 발하여 공개 2001년 10웏 Windows XP에 IPv6을 기본으로 탑재. 기본적인 것맊 구현 Windows Server 2003에 상용 수준의 IPv6 스택이 탑재 Windows Visata에서 IPv4/IPv6이 통합된 짂정한 듀얼스택을 개발하여 탑재. 드디어 IPv6을 완벽하게 구현 IE에서는 버젂 4에서 부터 IPv6을 지웎했음
  37. 37. IP 주소 할당 체계 ICANN (국제 읶터넷 주소 관리 기구)대륙 별 주소 관리 기구 APNIC ARIN LACNIC RIPE-NCC AfrNIC (아태 지역) (북미 지역) (남미 지역) (유럽 지역) (아프리카 지역)
  38. 38. 2웏3읷 기자 회견에서의 IPv4 주소 고갈의 의미 ICANN은 2웏 3일 기자 회견을 통해 IPv4 주소가 고갈 되었다고 보도 이 때의 고갈의 의미는 ICANN에서 각 대륙 별 주소 관리 기구에 주소 할당을 다했다는 의미로 지금 IPv4 주소가 더 이상 없다는 뜻이 아니다 ICANN은 대륙 별 주소 관리 기구에 인터넷 주소를 줄 때 큰 하나의 덩어리를 주는데 이 덩어리의 크기는 약 1700만개 정도의 읶터넷 주소이다. 2웏3일의 고갈은 마지막 남은 덩어리를 하나씩 각 대륙 별 주소 관리 기구에 다 주었다는 뜻이다. 그러나 APNIC의 경우 이번에 받은 덩어리를 약 4~6개웏 사이에 다 소짂고, 인터넷 인프라가 거의 없는 AfrNIC가 가장 오래 동안 사용할 수 있을 것으로 예측하고 있다.
  39. 39. IPv6과 NAT IPv4에서 주소 부족 문제를 해결하기 위해서 NAT(Network Address Translation) 기술을 사용 NAT은 주소 부족 문제를 해결해 주지맊 P2P 통싞에 문제가 있음 UPnP나 NAT Traversal 등으로 이 문제를 회피하지맊 완벽하지 않음 또 관리자 중 NAT을 내부와 외부 네트워크를 붂리하는 보안 기술이라는 생각 을 가지고 있음 특히 최근의 CGN, LSN 등의 3중 NAT는 어뷰즈 로깅, 위치 추적, NAT Traversal 기능도 못 쓰게 맊듬 NAT은 웹브라우징 이나 이메일 등의 일반 웹 서비스에는 문제가 없지맊 온라 인 P2P 게임, 비드오 스트리밍, 웹갬, 터널링, VPn, VoIP에서 품질 저하나 서비 스가 불가능 하는 경우가 있다 IPv6이 도입되면서 자연스럽게 NAT에서 IPv6으로 젂환하는 것이 좋음
  40. 40. IPv6과 보안 IPv4는 연구실에서 사용할 목적으로 맊듞 프로토콜로 설계 시에 보안은 거의 고려하지 않았음 IPv6은 처음 설계 시부터 보안을 고려해서 맊듞 IPv6은 IPv4 보다 보안이 더 뛰어나지맊 아직 보급된 시장이 작아서 IPv4에 비 해 보안 관련 장비가 부족함 IPv6 젂환기 동안에는 네트웍 관리자는 IPv4와 IPv6을 같이 관리해야 하므로 관리 비용이 2배로 늘었다고도 할 수 있음
  41. 41. World IPv6 Day 2011년 6웏 8일에 Internet Sociey(ISOC) 주최로 ‘World IPv6 Day’ 행사 개최 이 행사의 목적은 24시갂 동안 IPv6 웹 사이트를 올려서 젂 세계에서 접속이 가능한지 테스트 및 운영, 또 IPv4 주소가 부족하다는 것을 알리고 IPv6 도입 을 촉짂 시키기 위해서이다 구글을 시작으로 야후, 페이스북, Bing 및 미국 최대 케이블 회사인 comcast와 Time Warner cable나 시스코와 같은 기업들이 참가하기로 함
  42. 42. IPv6 사용 가능 여부 테스트 방법 http://test-ipv6.com/ 에 접속하면 알 수 있다
  43. 43. Big Game의 IPv6 지웎 MMORPG인 WOW의 PTR 패치에서 환경 설정에서 IPv6을 지웎(2011.03.17) http://www.fix6.net/archives/2011/03/17/latest-world-of-warcraft-ptr-patch- brings-ipv6-support/
  44. 44. 프로그래밍
  45. 45. API - IPv6 관련 구조체#include <netinet/in.h>struct sockaddr_in{ IPv4 in_port_t sin_port; // Port 번호 struct in_addr sin_addr; // 인터넷 주소 구조체}struct in_addr { in_addr_t s_addr; // 32bit 크기의 인터넷주소}#include <netinet/in.h>struct sockaddr_in6 IPv6{ u_int16m_t sin6_family; // AF_INET6 u_int16m_t sin6_port; // Port 번호 u_int32m_t sin6_flowinfo; // IPv6 flow information struct in6_addr sin6_addr;// IPv6 주소 u_long sin6_scope_id; // 읶터페이스 읶덱스 아이디} 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
  46. 46. API - socket IPv4 IPv6s = socket(PF_INET, SOCK_STREAM, 0); s = socket(PF_INET6, SOCK_STREAM, 0);s = socket(PF_INET, SOCK_DGRAM, 0); s = socket(PF_INET6, SOCK_DGRAM, 0); 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
  47. 47. API – bind (IPv6) struct sockaddr_in6 sin6; .... sin6.sin6_family = AF_INET6; sin6.sin6_flowinfo = 0; sin6_sin6_port = htons(23); sin6.sin6_addr = in6addr_any; sin6.sin6_addr = in6addr_any; sin6.sin6_scope_id = if_nametoindex("eth0"); .... if (bind(s, (struct sockaddr *)&sin6, sizeof(sin6)) == -1) { // 에러처리 } .... 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
  48. 48. API – listen, accept (IPv6) listen 변환 없음 accept struct sockaddr_in6 clisin6; clisockfd = accept(sockfd, (struct sockaddr *)&clisin6, (socklen_t *)&clilen); 출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog
  49. 49. API – inet_addr, inet_ntoa inet_addr inet_pton inet_ntoa inet_ntop WSAAddressToString inet_addr는 32비트, inet_pton는 128비트 그러나 C++에서의 최대 정수의 크기는 64비트 !!! inet_pton, inet_ntop는 Windows Vista부터 지웎
  50. 50. 코드- IPv6 주소 얻기 (Win32 API)#include ‹winsock2.h›#include ‹ws2tcpip.h›#include ‹stdio.h›int main(int argc, char *argv[]){ char *nodename; WSADATA wsaData; ADDRINFO hints; LPADDRINFO ai, ai0; int e; if (argc != 2) { fprintf(stderr, "syntax: getv6addr HOSTNAMEn"); exit(1); } nodename = argv[1]; WSAStartup(MAKEWORD(2, 2), &wsaData); /* resolving "www.ipv6style.jp" */ memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_INET6; if (e = getaddrinfo(nodename, NULL, &hints, &ai0)) { fprintf(stderr, "%s: %sn", nodename, gai_strerror(e)); WSACleanup(); exit(1); } for (ai = ai0; ai; ai = ai->ai_next) { char v6addrstr[NI_MAXHOST]; getnameinfo(ai->ai_addr, ai->ai_addrlen, v6addrstr, sizeof(v6addrstr), NULL, 0, NI_NUMERICHOST); printf("%s IPv6 address: %sn", nodename, v6addrstr); } freeaddrinfo(ai0); WSACleanup();} 출처: http://www.ipv6style.jp/jp/apps/20051024/index.shtml
  51. 51. 코드- IPv6 주소 얻기 (Win32 API)#include ‹winsock2.h›#include ‹ws2tcpip.h›#include ‹stdio.h›int main(int argc, char *argv[]){ PHOSTENT pHostInfo = NULL; char szHostName[255] = {0, }; if (gethostname(szHostName, 255) == 0) { /// Windows XP1 이상 DWORD dwSize; LPADDRINFO lpAddrInfo; ADDRINFO addrHints; ZeroMemory(&addrHints, sizeof(addrinfo)); if( bUseIPv6Address ) { addrHints.ai_family = AF_INET6; } else { addrHints.ai_family = AF_INET; } if (getaddrinfo(szHostName, NULL, &addrHints, &lpAddrInfo) != 0) { return false; } dwSize = MAX_IP_STRING_LENGTH; if( 0 != WSAAddressToString(lpAddrInfo->ai_addr, (DWORD)lpAddrInfo->ai_addrlen, NULL, szIP, &dwSize) ) { return false; } }} 출처: http://www.ipv6style.jp/jp/apps/20051024/index.shtml
  52. 52. 접속할 곳이 IPv6 지웎을 하는지 어떻게 알 수 있을까? 보통 어느 노드에 접근할 때는 FQDN(Fully Qualified Domain Name.인터 넷 상에서 단말을 식별하기 위한 이름)을 기초로 하여 DNS 서버에 질문 한다. 듀얼 스택은 바로 이것을 활용한다. IPv4맊 대응하는 경우 보통 IPv4 주소를 기록한 A 레코드맊 DNS 서버에 등록. 듀얼 스택의 경우 여기에 IPv6 주소를 기록한 AAAA 레코드를 기록. IPv4와 IPv6 둘 다 대응하는 프로그램은 - AAAA 레코드에 등록된 IPv6 주소 접근을 시도 - AAAA 레코드 접속이 실패하면 A 레코드 주소로 접근 IPv4, IPv6, 이 후의 프로토콜에 비 의졲적인 네트웍 프로그래밍을 위해서 는 gethostbyname 대싞 getaddrinfo, getnameinfo를 사용해야 한다.
  53. 53. #include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#include <netdb.h>int sock,err;struct addrinfo hints, *res0, *res;memset(&hints, 0, sizeof(hints));hints.ai_family = PF_UNSPEC;hints.ai_socktype = SOCK_STREAM;/* getaddrinfo로 AAAA 및 A 레코드 획득*/err = getaddrinfo("www.linux-ipv6.org", "http", &hints, &res0);if (err) { fprintf(stderr, "error : %s", gai_strerror(err)); freeaddrinfo(res0); exit(1);}/* getaddrinfo의 결과를 이용하여 접속이 성공할 때까지 시도한다 */for (res = res0; res; res = res->ai_next) { sock = socket (res->ai_family, res->ai_socktype, res->ai_protocol); if (sock < 0) continue; if (connect(sock, res->ai_addr, res->ai_addrlen) < 0) { close (sock); continue; } break;}freeaddrinfo(res0);・・・ 출처: http://www.ipv6style.jp/jp/apps/20030617/index.shtml
  54. 54. 코드- IPv6 서버 (Win32 API)#include ‹winsock2.h›#include ‹ws2tcpip.h›#include ‹stdio.h›#include ‹process.h›void tcp_echo_io(void *arg);int main(int argc, char *argv[]){ WSADATA wsaData; int i; char *servname = "echo"; ADDRINFO hints; LPADDRINFO ai, ai0; int e; SOCKET s[64]; int nsocks; fd_set rfd0; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { fprintf(stderr, "can not initilize WinSockn"); exit(1); } memset(&hints, 0, sizeof(hints)); hints.ai_family = AF_UNSPEC; hints.ai_socktype = SOCK_STREAM; hints.ai_flags = AI_PASSIVE; if (e = getaddrinfo(NULL, servname, &hints, &ai0)) { fprintf(stderr, "%sn", gai_strerror(e)); exit(1); }
  55. 55. for (nsocks = 0, ai = ai0; ai; ai = ai->ai_next){ s[nsocks] = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (s[nsocks] == INVALID_SOCKET) continue; if (bind(s[nsocks], ai->ai_addr, ai->ai_addrlen) == SOCKET_ERROR) { closesocket(s[nsocks]); s[nsocks] = INVALID_SOCKET; continue; } if (listen(s[nsocks], 5) == SOCKET_ERROR) { closesocket(s[nsocks]); s[nsocks] = INVALID_SOCKET; continue; } nsocks++; printf("create %s listen socketn", (ai->ai_family == AF_INET) ? "IPv4" : (ai->ai_family == AF_INET6) ? "IPv6" : "Unknown");}if (nsocks == 0) { fprintf(stderr, "can not create listen socket with any protocoln"); exit(1);}
  56. 56. FD_ZERO(&rfd0);for (i = 0; i < nsocks; ++i) FD_SET(s[i], &rfd0);while (1) { fd_set rfd; SOCKET iosock; SOCKADDR_STORAGE ss; int sslen; rfd = rfd0; if (select(FD_SETSIZE, &rfd, NULL, NULL, NULL) == SOCKET_ERROR) { fprintf(stderr, "select errorn"); exit(1); } for (i = 0; i < nsocks; ++i) { if (FD_ISSET(s[i], &rfd)) { sslen = sizeof(ss); iosock = accept(s[i], (LPSOCKADDR)&ss, &sslen); if(iosock == INVALID_SOCKET) { fprintf(stderr, "accept errorn"); exit(1); } if (_beginthread(tcp_echo_io, 0, &iosock) == -1) { fprintf(stderr, "can not create threadn"); exit(1); } } }}
  57. 57. void tcp_echo_io(void *arg){ SOCKET s; char buf[BUFSIZ]; int bufsiz; printf("start threadn"); s = *(SOCKET *)arg; while ((bufsiz = recv(s, buf, sizeof(buf) - 1, 0)) != 0) { if (bufsiz == SOCKET_ERROR ) break; buf[bufsiz] = 0; printf("recv string: %sn", buf); if (send(s, buf, bufsiz, 0) == SOCKET_ERROR) break; printf("send string: %sn", buf); } printf("end threadn"); closesocket(s); _endthread();} 출처: http://www.ipv6style.jp/jp/apps/20051128/index.shtml
  58. 58. 코드- IPv6 클라이언트 (Win32 API)#include ‹winsock2.h›#include ‹ws2tcpip.h›#include ‹stdio.h›int main(int argc, char *argv[]){ WSADATA wsaData; char *nodename; char *servname = "echo"; ADDRINFO hints; LPADDRINFO ai, ai0; int e; SOCKET s; char linebuf[BUFSIZ]; if (argc != 2) { fprintf(stderr, "syntax: tcp-echo-client servername¥n"); exit(1); } nodename = argv[1]; if (WSAStartup(MAKEWORD(2, 2), &wsaData)) { fprintf(stderr, "can not initilize WinSock¥n"); exit(1); }
  59. 59. memset(&hints, 0, sizeof(hints));hints.ai_family = AF_UNSPEC;hints.ai_socktype = SOCK_STREAM;if (e = getaddrinfo(nodename, servname, &hints, &ai0)) { fprintf(stderr, "%s¥n", gai_strerror(e)); exit(1);}for (ai = ai0; ai; ai = ai->ai_next) { s = socket(ai->ai_family, ai->ai_socktype, ai->ai_protocol); if (s == INVALID_SOCKET) continue; if (connect(s, ai->ai_addr, ai->ai_addrlen) == SOCKET_ERROR) { closesocket(s); s = INVALID_SOCKET; continue; } printf("connected¥n"); break;}if (s == INVALID_SOCKET) { freeaddrinfo(ai0); WSACleanup(); fprintf(stderr, "can not connect server(%s)¥n", nodename); exit(1);}
  60. 60. while (fgets(linebuf, sizeof(linebuf), stdin) != NULL) { if (send(s, linebuf, strlen(linebuf), 0) == SOCKET_ERROR) { fprintf(stderr, "send error¥n"); exit(1); } if (recv(s, linebuf, sizeof(linebuf), 0) == SOCKET_ERROR) { fprintf(stderr, "recv error¥n"); exit(1); } printf(linebuf); } freeaddrinfo(ai0); WSACleanup();} 출처: http://www.ipv6style.jp/jp/apps/20051114/index.shtml
  61. 61. GunZ2의 네트웍 라이브러에 IPv6 추가 지웎 작업1. IPv6에 대한 이롞 공부2. 플밍 시작 - IP 문자열 키우기 - IPv4와 IPv6 둘 다 사용할 수 있도록 네트웍 라이브러 변경 - IPv6 호환 Socket API 변환 - IP 주소 문자열을 정수로 변환하여 사용하는 것 모두 제거3. 테스트 - 테스트할 PC의 네트웍 환경을 IPv6으로 변경
  62. 62. 참고IPv6 개요 (한국어)http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6IntroIPv6 프로그래밍 (한글)http://www.joinc.co.kr/modules/moniwiki/wiki.php/Site/TCP_IP/IPv6/IPv6Prog5붂으로 이해하는 IPv6 프로그래밍 (읷본어)http://www.ipv6style.jp/jp/apps/20030617/index.shtmlIPv6 소켓 프로그래밍 (읷본어)http://www.nslabs.jp/socket.rhtmlWindows에서의 IPv6 소켓 프로그래밍 강좌 (읷본어)http://www.admintech.jp/wiki.cgi?page=Windows%A4%C7%A4%CEIPv6%A5%D7%A5%ED%A5%B0%A5%E9%A5%DF%A5%F3%A5%B0%B9%D6%BA%C2문제로 풀어보는 IPv4와 IPv6 (읷본어)http://www.ie.u-ryukyu.ac.jp/~e055723/info2/ipv6/main.html
  63. 63. Introduction to IPv6 Programming (영어)http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdfIPv6으로 시작하는 네트워크 (읷본어)http://journal.mycom.co.jp/series/ipv6/001/index.htmlIPv6 위키피디아 (읷본어)http://ja.wikipedia.org/wiki/IPv6#cite_note-5Windows 7에서 IPv6 환경 설정 (읷본어)https://ybb.softbank.jp/support/connect/step2/ipv6/win7_net_set.htmlIPv6_Vasily (한글. 블로그)http://blog.daum.net/ipv6MS TechNet – IPv6http://technet.microsoft.com/ko-kr/library/cc755011%28WS.10%29.aspx

×