2016-10-31 1 views
-3

누군가가 구조체 addrinfo가 정의되어 있는지 (헤더?) 알고 있는지 궁금해합니다. 소켓 프로그래밍에 사용 된 것 같지만 선언 된 적이 없습니다. 같은 struct addrinfo *head; 무작위로 사용되지만되는 addrinfo가 선언되지 않습니다."addrinfo"에 대한 몇 가지 정보 C?

그리고, 그것은 (되는 addrinfo에서) 데이터 형식 'socklen_t'이 있습니다. 데이터 형식 또는 정확히 그런 것을인가에? 거기에 또한

하게 struct addrinfo *ai_next있다 나를 궁금해 : 그게 유용할까요? 내 이해에 addrinfo 다른 소켓과 연결하는 방법에 대한 정보를 저장하고 정확한 주소를 저장 struct sockaddr *ai_addr 연결하고자하는 (즉, IP 번호 및 TCP/IP의 경우 포트 번호). 그래서 그 말로하면, 단지 하나의 addrinfo 구조체가 필요합니다. 원하는 연결 데이터를 저장하는 beeing 구조체가 필요합니까? 왜 더있어?

다음 : getaddrinfo의 마지막 인수는 무엇입니까? 그 struct addrinfo **res라고하지만 그게 뭔지 알아낼 수 없다. , 힌트를 입력되는 addrinfo의 또 다른 구조체와 표기법

struct addrinfo hints = { 
    .ai_flags = AI_ADDRCONFIG, 
    .ai_socktype = SOCK_STREAM, 
    .ai_family = PF_UNSPEC 
}; 

내가 말할 때 내가 해결 오전 : :

.ai_flags = AI_ADDRCONFIG, 

나에게 너희들을 위해 아주 쉽게 할 수있는 마지막 하나를 허용

은 실제로 짧음 :

struct addrinfo hints; 
hints.ai_flags = AI.... 

사람들은 내가 아는 것을 읽게합니다! 당신에게 사랑 &과 관련이 같은 모든

+2

[getaddrinfo 매뉴얼 페이지] (http://man7.org/linux/man-pages/man3/getaddrinfo.3.html)는 모든 것을 알려줍니다. 또는 인터넷을 통해 많은 정보가 담긴 자습서를 찾아보십시오. –

+0

"더블 포인터"에 관해서는 C에서 참조에 의한 패스를 에뮬레이션하는 방법입니다. –

+0

더블 포인터는 문제가 아닙니다. 문제는, 내가 무엇을해야할 지 모른다는 것입니다. res "가 있어야합니다. –

답변

0

되는 addrinfo 구조체의 모양을

struct addrinfo { 
       int    ai_flags; 
       int    ai_family; 
       int    ai_socktype; 
       int    ai_protocol; 
       socklen_t  ai_addrlen; 
       struct sockaddr *ai_addr; 
       char   *ai_canonname; 
       struct addrinfo *ai_next; 
       }; 

자료 : http://man7.org/linux/man-pages/man3/getaddrinfo.3.html

socklen_t는 INT의 형식 정의입니다.

typedef _U32_TYPE int; 
... 
typedef socklen_t _U32_TYPE; 

출처 : https://fossies.org/dox/glibc-2.24/bits_2types_8h.html

ai_next가 링크 된 목록을 작성하는 데 사용됩니다. 이 구조체를 사용하는 방법을 정확히 알지는 못하지만 여러 소켓에 연결할 필요가 있다고 생각합니다.

한다 getaddrinfo() 함수를 할당하고되는 addrinfo 구조의 연결리스트, 힌트에 의해 부과 된 제한 사항에 따라 노드와 서비스를 일치하는 각 네트워크 주소를 초기화하고, 목록의 시작에 대한 포인터를 반환 안으로 입술.

따라서 getaddrinfo()을 호출 한 후 *res이 연결된 목록의 첫 번째 요소가됩니다.

마지막으로, 나는 당신의 구문이 올바른 경우 정말 확실하지 않다, 그러나 이것은 올바른 것입니다 : 당신이 그렇게하면이 작업을 수행 할 때 동안, 당신이 직접 그 멤버를 초기화

struct addrinfo hints = { 
    .ai_flags = AI_ADDRCONFIG, 
    .ai_socktype = SOCK_STREAM, 
    .ai_family = PF_UNSPEC 
}; 

:

struct addrinfo hints; 
hints.ai_flags = AI_ADDRCONFIG; 
hints.ai_socktype = SOCK_STREAM; 
hints.ai_family = PF_UNSPEC; 

구조체를 정의하고 (정의되지 않은 내용으로 채워짐) 멤버를 초기화합니다.

결과는 같지만 메모리의 동작은 약간 다릅니다.

+0

OP가 선언했습니다. [힌트]는 [지정된 이니셜 라이저] (https://en.wikipedia.org/wiki/C_syntax#Designated_initializers)를 사용하고 있습니다. 힌트 선언이 잘못되어 컴파일되지 않습니다. –

+0

오, 그래, 네가 맞아. 그 실수 – Ludonope