Difference between revisions of "Socket structs"

From Ilianko
(Created page with "== addrinfo == <code> struct addrinfo { int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc. int ai_family; // AF_INET, AF_INET6, AF_UNSPEC int ai_socktype; ...")
 
 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
 
== addrinfo ==
 
== addrinfo ==
  
<code>
+
<code><pre>
 +
-----------
 +
addrinfo
 +
-----------
 +
|
 +
sockaddr
 +
|
 +
</pre></code>
 +
 
 +
<code><pre>
 
struct addrinfo  
 
struct addrinfo  
 
{
 
{
Line 13: Line 22:
 
   struct addrinfo *ai_next; // linked list, next node
 
   struct addrinfo *ai_next; // linked list, next node
 
};
 
};
</code>
+
</pre></code>
 +
 
 +
== Адреси ==
 +
<code><pre>
 +
struct sockaddr {
 +
  unsigned short sa_family;  // address family, AF_xxx
 +
  char          sa_data[14]; // 14 bytes of protocol address
 +
};
 +
</pre></code>
 +
където
 +
*'''sa_family''' е най-често - AF_INET за IPv4 или AF_INET6  за IPv6
 +
*'''sa_data''' е дестинация и порт сокета
 +
 
 +
или
 +
 
 +
 
 +
за IPv4
 +
<code><pre>
 +
struct sockaddr_in {
 +
    short int          sin_family;  // Address family, AF_INET
 +
    unsigned short int sin_port;    // Port number
 +
    struct in_addr    sin_addr;    // Internet address
 +
    unsigned char      sin_zero[8]; // Same size as struct sockaddr
 +
};
 +
</pre></code>
 +
където
 +
 
 +
<code><pre>
 +
struct in_addr {
 +
    uint32_t s_addr; // that's a 32-bit int (4 bytes)
 +
};
 +
</pre></code>
 +
 
 +
за IPv6
 +
<code><pre>
 +
struct sockaddr_in6 {
 +
  u_int16_t      sin6_family;  // address family, AF_INET6
 +
  u_int16_t      sin6_port;    // port number, Network Byte Order
 +
  u_int32_t      sin6_flowinfo; // IPv6 flow information
 +
  struct in6_addr sin6_addr;    // IPv6 address
 +
  u_int32_t      sin6_scope_id; // Scope ID
 +
};
 +
 
 +
struct in6_addr {
 +
    unsigned char  s6_addr[16];  // IPv6 address
 +
};
 +
</pre></code>
 +
 
 +
<code><pre>
 +
struct sockaddr_storage {
 +
    sa_family_t ss_family;      // address family
 +
    // all this is padding, implementation specific, ignore it:
 +
    char      __ss_pad1[_SS_PAD1SIZE];
 +
    int64_t  __ss_align;
 +
    char      __ss_pad2[_SS_PAD2SIZE];
 +
};
 +
</pre></code>
 +
 
 +
 
 +
 
 +
[[Category:sockets]]

Latest revision as of 13:59, 12 April 2013

addrinfo

-----------
addrinfo
-----------
|
sockaddr
|
struct addrinfo 
{
  int ai_flags;          // AI_PASSIVE, AI_CANONNAME, etc.
  int ai_family;         // AF_INET, AF_INET6, AF_UNSPEC
  int ai_socktype;       // SOCK_STREAM, SOCK_DGRAM
  int ai_protocol;       // use 0 for "any"
  size_t ai_addrlen;     // size of ai_addr in bytes
  struct sockaddr *ai_addr; // struct sockaddr_in or _in6
  char *ai_canonname;    // full canonical hostname
  struct addrinfo *ai_next; // linked list, next node
};

Адреси

struct sockaddr {
  unsigned short sa_family;   // address family, AF_xxx
  char           sa_data[14]; // 14 bytes of protocol address
};

където

  • sa_family е най-често - AF_INET за IPv4 или AF_INET6 за IPv6
  • sa_data е дестинация и порт сокета

или


за IPv4

struct sockaddr_in {
    short int          sin_family;  // Address family, AF_INET
    unsigned short int sin_port;    // Port number
    struct in_addr     sin_addr;    // Internet address
    unsigned char      sin_zero[8]; // Same size as struct sockaddr
};

където

struct in_addr {
    uint32_t s_addr; // that's a 32-bit int (4 bytes)
};

за IPv6

struct sockaddr_in6 {
  u_int16_t       sin6_family;   // address family, AF_INET6
  u_int16_t       sin6_port;     // port number, Network Byte Order
  u_int32_t       sin6_flowinfo; // IPv6 flow information
  struct in6_addr sin6_addr;     // IPv6 address
  u_int32_t       sin6_scope_id; // Scope ID
};

struct in6_addr {
    unsigned char   s6_addr[16];   // IPv6 address
};
struct sockaddr_storage {
    sa_family_t ss_family;      // address family
    // all this is padding, implementation specific, ignore it:
    char      __ss_pad1[_SS_PAD1SIZE];
    int64_t   __ss_align;
    char      __ss_pad2[_SS_PAD2SIZE];
};