sockaddr

Struktur sockaddr bervariasi tergantung pada protokol yang dipilih. Kecuali untuk parameter sin*_family , konten sockaddr dinyatakan dalam urutan byte jaringan.

Fungsi Winsock menggunakan sockaddr tidak ditafsirkan secara ketat untuk menjadi penunjuk ke struktur sockaddr. Struktur ditafsirkan secara berbeda dalam konteks keluarga alamat yang berbeda. Satu-satunya persyaratan adalah bahwa u_short pertama adalah keluarga alamat dan ukuran total buffer memori dalam byte adalah namelen.

Struktur SOCKADDR_STORAGE juga menyimpan informasi alamat soket dan strukturnya cukup besar untuk menyimpan informasi alamat IPv4 atau IPv6. Penggunaan struktur SOCKADDR_STORAGE mempromosikan kemandirian keluarga protokol dan versi protokol, dan menyederhanakan pengembangan. Disarankan agar struktur SOCKADDR_STORAGE digunakan sebagai pengganti struktur sockaddr. Struktur SOCKADDR_STORAGE didukung pada Windows Server 2003 dan yang lebih baru.

Struktur sockaddr dan struktur sockaddr_in di bawah ini digunakan dengan IPv4. Protokol lain menggunakan struktur serupa.

struct sockaddr {
        ushort  sa_family;
        char    sa_data[14];
};

struct sockaddr_in {
        short   sin_family;
        u_short sin_port;
        struct  in_addr sin_addr;
        char    sin_zero[8];
};

Struktur sockaddr_in6 dan sockaddr_in6_old di bawah ini digunakan dengan IPv6.

struct sockaddr_in6 {
        short   sin6_family;
        u_short sin6_port;
        u_long  sin6_flowinfo;
        struct  in6_addr sin6_addr;
        u_long  sin6_scope_id;
};

typedef struct sockaddr_in6 SOCKADDR_IN6;
typedef struct sockaddr_in6 *PSOCKADDR_IN6;
typedef struct sockaddr_in6 FAR *LPSOCKADDR_IN6;


struct sockaddr_in6_old {
        short   sin6_family;        
        u_short sin6_port;          
        u_long  sin6_flowinfo;      
        struct  in6_addr sin6_addr;  
};

Pada Kit Pengembangan Perangkat Lunak (SDK) Microsoft Windows yang dirilis untuk Windows Vista dan yang lebih baru, tag typedef SOCKADDR dan SOCKADDR_IN didefinisikan untuk struktur sockaddr dan sockaddr_in sebagai berikut:

typedef struct sockaddr {
#if (_WIN32_WINNT < 0x0600)
    u_short sa_family;
#else 
    ADDRESS_FAMILY sa_family;
#endif //(_WIN32_WINNT < 0x0600)
    CHAR sa_data[14];
} SOCKADDR, *PSOCKADDR, FAR *LPSOCKADDR;


typedef struct sockaddr_in {
#if(_WIN32_WINNT < 0x0600)
    short   sin_family;    
#else //(_WIN32_WINNT < 0x0600)
    ADDRESS_FAMILY sin_family;
#endif //(_WIN32_WINNT < 0x0600)
    USHORT sin_port;
    IN_ADDR sin_addr;
    CHAR sin_zero[8];
} SOCKADDR_IN, *PSOCKADDR_IN;

Pada Windows SDK yang dirilis untuk Windows Vista dan yang lebih baru, organisasi file header telah berubah dan struktur sockaddr dan sockaddr_in didefinisikan dalam file header Ws2def.h , bukan file header Winsock2.h . File header Ws2def.h secara otomatis disertakan oleh file header Winsock2.h . Struktur sockaddr_in6 didefinisikan dalam file header Ws2ipdef.h , bukan file header Ws2tcpip.h . File header Ws2ipdef.h secara otomatis disertakan oleh file header Ws2tcpip.h . File header Ws2def.h dan Ws2ipdef.h tidak boleh digunakan secara langsung.

Contoh Kode

Contoh berikut menunjukkan penggunaan struktur sockaddr .


// Declare variables
SOCKET ListenSocket;
struct sockaddr_in saServer;
hostent* localHost;
char* localIP;

// Create a listening socket
ListenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

// Get the local host information
localHost = gethostbyname("");
localIP = inet_ntoa (*(struct in_addr *)*localHost->h_addr_list);

// Set up the sockaddr structure
saServer.sin_family = AF_INET;
saServer.sin_addr.s_addr = inet_addr(localIP);
saServer.sin_port = htons(5150);

// Bind the listening socket using the
// information in the sockaddr structure
bind( ListenSocket,(SOCKADDR*) &saServer, sizeof(saServer) );


Lihat juga

SOCKADDR_STORAGE