2016-08-17 2 views
1

std.socket을보고 있었고 IP 유형을 확인하기 위해 다음을 수행 할 수 있었지만 IP 주소의 바이트 배열을 가져 오는 방법을 찾을 수 없습니다. D를 사용하여 IP 주소를 바이트 배열로 변환하는 방법은 무엇입니까?

auto results = getAddressInfo(ipaddress, AddressInfoFlags.NUMERICHOST); 

if (results.length && results[0].family == AddressFamily.INET) { 
    writeln("IPv4 : " ~ results[0].address.toAddrString()); 
    return 4; 
} 
else if (results.length && results[0].family == AddressFamily.INET6) { 
    writeln("IPv6 : " ~ results[0].address.toAddrString()); 
    return 6; 
} 

나는 바이트 배열을 반환하는 요지() 속성이 InternetAddress 및 Internet6Address 같은 클래스의 몇 가지를 보았다 그러나 나는이 2 개 개의 클래스에 위의 내 코드에서 이동하는 방법을 잘 모르겠습니다.

답변

1

이 작업을 수행하는 한 가지 방법은 Address.name을 사용하여 core.sys.posix.sys.socket.sockaddr 구조에 대한 포인터를 얻는 것입니다. auto saddr_ptr = results[0].address.name;과 같은 것입니다. 그런 다음이 포인터를 적절한 유형의 포인터로 캐스팅하여 필요한 데이터를 추출 할 수 있습니다 (주소 패밀리에 따라 다름).

module main; 

import std.stdio; 
import std.socket; 
import std.c.linux.socket: sockaddr_in, in_addr; 

void main(string[] args) { 
    // auto results = getAddressInfo("www.digitalmars.com"); 

    try { 
     Address[] addresses = getAddress("dlang.org", 80); 
     writefln(" %d addresses found.", addresses.length); 
     foreach (int i, Address a; addresses) { 

      writefln(" Address %d:", i+1); 
      writefln(" IP address: %s", a.toAddrString()); 
      writefln(" Hostname: %s", a.toHostNameString()); 
      writefln(" Port: %s", a.toPortString()); 
      writefln(" Service name: %s", a.toServiceNameString()); 
      auto saddr_ptr = a.name; 
      auto in_ptr = *(cast(sockaddr_in*) saddr_ptr); 
      // let's convert it to ubyte[4] so we can access individual 
      // parts of the IPv4 address. 
      writeln(cast(ubyte[4])(in_ptr.sin_addr)); 
     } 
    } catch (SocketException e) { 
     writefln(" Lookup error: %s", e.msg); 
    } 

    // Lets the user press <Return> before program returns 
    stdin.readln(); 
} 

출력 :

3 addresses found. 
    Address 1: 
    IP address: 162.217.114.56 
    Hostname: digitalmars.com 
    Port: 80 
    Service name: http 
[162, 217, 114, 56] 
    Address 2: 
    IP address: 162.217.114.56 
    Hostname: digitalmars.com 
    Port: 80 
    Service name: http 
[162, 217, 114, 56] 
    Address 3: 
    IP address: 162.217.114.56 
    Hostname: digitalmars.com 
    Port: 80 
    Service name: http 
[162, 217, 114, 56] 
+0

여기

는 uint32_t 값으로에게 주소를 제공하고 [4] 배열 ubyte하도록 Conver 유럽하기 SOCKADDR의 *를 사용 getAddress에() 문서의 변형 예 std.c.linux.socket을 가져 오려고 할 때 오류가 발생했습니다 (더 이상 사용되지 않습니다). 따라서 uint ipno = new InternetAddress (ip, 80) .addr(); – Vlam

관련 문제