2013-07-02 2 views
2

, 나는 이와 같은 목록을 작성하는 로컬 소켓 getaddrinfo(NULL,port,&hints,&servinfo)에에 getaddrinfo()에 전화를 사용할 수 있습니다한다 getaddrinfo() 리눅스 VS 윈도우는 리눅스에서

IPv4: 0.0.0.0 
| socktype: 1 |protocol: 6 IPv4: 0.0.0.0 
| socktype: 2 |protocol: 17 IPv4: 0.0.0.0 
| socktype: 3 |protocol: 0 IPv6: :: 
| socktype: 1 |protocol: 6 IPv6: :: 
| socktype: 2 |protocol: 17 IPv6: :: 
| socktype: 3 |protocol: 0 

을 반면 창에서 로컬에 관한 모든 통화 기계 "NULL", "localhost", "127.0.0.1" (실제로는 URL이 아님)은 실패한 것으로 보입니다.

리눅스와 windows간에 getaddrinfo()을 사용하는 데있어서 의도 된 차이점은 무엇입니까?

또한 - 저는 이런 종류의 질문을 두 가지로합니다.하지만 첫 번째 프로그램의 결과물이 정확히 무엇을 말해 줍니까? 커널이 해당 포트에서 사용할 수있는 유일한 조합입니까?

예,이 질문은 다소 유명한 "Beej 's Guide to Network Programming"에서 발전했습니다.

 struct addrinfo hints,*ai,*p; 

    memset(&hints,0,sizeof(hints)); 
    hints.ai_family = AF_UNSPEC; 
    hints.ai_socktype = SOCK_DGRAM; 
    hints.ai_flags = AI_PASSIVE; 
    int error; 

    memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6 
hints.ai_socktype = SOCK_STREAM; 

if ((error = getaddrinfo("www.example.com", "http", &hints, &ai)) != 0) { 
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(error)); 
    exit(1); 
} else cout <<"Success with a URL\n"; 


if (error=(getaddrinfo("208.117.45.202",&port,&hints,&ai))){ 
     cout<<"Cannot resolve any usable ports! : "<<gai_strerror(error)<< " : "<<error; 
     if (ai == NULL) return -5; 
} 

감사 :

이에 이르기까지의 코드는 같은입니다!

+0

아마 더 많은 코드를 보여 주어야합니다. [getaddrinfo()에 대한 MSDN 문서] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms738520%28v=vs.85%29.aspx)는 꽤 철저합니다. 정말 localhost의 경우에도 작동해야하는 것처럼 들립니다. – unwind

+0

Windows 플랫폼 (예 : XAMPP)에서 서버를 실행하고 있습니까? –

+0

아니요, 서버가 없습니다. 서버로서의 상태가'getaddrinfo()'호출의 동작에 차이가 있는지 궁금 해서요 ...하지만 다른 문제로 인해 OS 분할에 대해 생각하는 경향이있었습니다 ... – user1833028

답변

2

man pages이라는 마법의 것들이 있습니다. 예를 들어, man 3 getaddrinfo 명확하게

경우 AI_PASSIVE 플래그가 hints.ai_flags에 지정하고, 노드가 bind() 소켓 것이다 accept() 연결을 보내고 위해 다음 반환 된 소켓 주소가 적합 할 것, NULL이되는 것을 말한다. 반환 된 소켓 주소에는 "와일드 카드 주소"( IPv4 주소의 경우 INADDR_ANY, IPv6 주소의 경우 IN6ADDR_ANY_INIT)가 포함됩니다. 와일드 카드 주소는 호스트의 네트워크 주소에서 연결을 허용하려는 응용 프로그램 (일반적으로 서버)에서 사용됩니다. 노드 이 NULL이 아닌 경우 AI_PASSIVE 플래그는 무시됩니다.

getaddrinfo() 기능의 목적은 간단하다 :이 응용 프로그램이 소켓을 만드는 데 사용할 수있는 숫자 데이터에 사용자가 지정한 문자열을 변환하기 위해 최선을 시도, 둘 중 하나 들어오는 연결을 수신하거나 연결을위한 한.

getaddrinfo()POSIX.1-2001 (및 RFC 2553)으로 지정되며 Microsoft는 확장하거나 변형 할 수있는 표준을 따르지 않는 것으로 알려져 있으므로 물론 Windows에서는 완전히 다른 기능입니다. 관련 MSDN page이 "ANSI 호스트 이름에서 주소로 프로토콜 독립적 인 변환을 제공합니다"라고 말합니다.

프로그램의 출력, node (첫 번째 매개 변수) NULL, 당신이 플래그에 AI_PASSIVE을 가지고 있기 때문에, 와일드 카드의 목록입니다 프로그램이에 바인딩 (시도) 할 수 들어오는 연결을 수신 주소를 지정한 port으로 변경하십시오.

0

코딩 일관성은 어떻게 되었습니까?

memset(&hints,0,sizeof(hints)); 
hints.ai_family = AF_UNSPEC; 
hints.ai_socktype = SOCK_DGRAM; 
hints.ai_flags = AI_PASSIVE; 
int error; 

memset(&hints, 0, sizeof hints); 
hints.ai_family = AF_UNSPEC; // use AF_INET6 to force IPv6 
hints.ai_socktype = SOCK_STREAM; 

당신이 첫번째 sizeof(hints) 제로 hints; 그런 다음 몇 가지 값을 설정합니다. 그런 다음 sizeof hints (불일치)으로 다시 0으로 설정하십시오. 그런 다음 두 번째 값을 설정하고 다른 값을 놓칩니다 (특히 AI_PASSIVE 플래그). 프로그래밍은 일반적으로 일관성이 있다면 가장 쉽습니다. 또한 당신이했던 것처럼 똑같이 두 번 (다소간)하는 것을 피하는 것이 현명합니다. 하나 또는 다른 시퀀스를 선택하고 두 시퀀스를 모두 포함하지 마십시오.

이것이 실제로 문제의 원인인지는 별도의 문제입니다. answer (Nominal Animal)은 Microsoft와 관련된 세부 사항을 확인하지는 않았지만 관련성이 높은 부분을 다루고 있습니다.

+0

나는 그것을 인터넷에 만들도록 시켰습니까? * 예, 감사합니다. – user1833028

관련 문제