programing

구조 sockaddr_un vs sockaddr

sourcetip 2023. 9. 9. 23:14
반응형

구조 sockaddr_un vs sockaddr

어떻게 있다.struct sockaddr과는 다른struct sockaddr_un?

저는 소켓을 소켓 주소에 바인딩하기 위해 클라이언트-서버 모듈에서 이러한 구조를 사용한다는 것을 알고 있습니다.그리고 우리는 구조를 수용하기 위해 캐스트 연산자를 사용합니다.sockaddr_un.

둘이 얼마나 다르거나 비슷하고, 출연자가 왜 다른지 알고 싶습니다.

"sockaddr"은 일반적인 정의입니다.주소가 필요한 모든 소켓 기능에 사용됩니다.

"struct sockaddr_un"("Unix sockets" 주소)은 특정 종류의 주소 패밀리입니다.

"struct sockaddr_in"("인터넷 소켓" 주소)은 더 일반적으로 볼 수 있는 다른 종류의 주소 패밀리입니다.

캐스트는 소켓 API가 실제로 여러 실제 유형 중 하나가 될 공통 매개 변수 유형을 허용하는 것입니다.

다음은 여러 가지 다양한 주소 패밀리 정의를 보여주는 좋은 링크입니다.

http://www.cas.mcmaster.ca/ ~qiao/graphics/cs3mh3/graphics/graphics.graphics

A struct sockaddr일반적으로 포인터의 기본 유형으로만 사용해야 합니다.주소 패밀리별 소켓 주소 유형에서 멤버들의 공통 초기 순서를 포괄하기 위한 구조입니다 (struct sockaddr_un,struct sockaddr_in,struct sockaddr_in6등)

의지할 수 있는 유일한 멤버.struct sockaddr가지는 것은 싱글입니다.sa_family_t, 소켓 주소 패밀리를 나타냅니다.이 아이디어는 일종의 다형성을 얻기 위해 여러 소켓 주소 유형에서 작동할 수 있는 함수를 가질 수 있다는 것입니다.

void foo(struct sockaddr *sa)
{
    switch(sa->sa_family)
    {
    case AF_INET: {
        struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;

        /* AF_INET processing */
    }

    case AF_UNIX: {
        struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;

        /* AF_UNIX processing */
    }

/* ... */

위와 같은 코드는 일반적으로 C의 "엄격한 앨리어싱" 규칙을 어기는 것으로 간주되지만, 자신의 코드에서 이를 수행하려면 유니언 유형을 사용해야 합니다.

union sockaddr {
    struct sockaddr sa;
    struct sockaddr_in sin;
    struct sockaddr_un sun;
    /* ... */
};

void foo(union sockaddr *sa_union)
{
    struct sockaddr *sa = (struct sockaddr *)sa_union;

    switch(sa->sa_family)
    {
    case AF_INET: {
        struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;

        /* AF_INET processing */
    }

    case AF_UNIX: {
        struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;

        /* AF_UNIX processing */
    }

/* ... */

언급URL : https://stackoverflow.com/questions/3689925/struct-sockaddr-un-vs-sockaddr

반응형