博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[Network] socket draft

Posted on 2010-06-11 09:48  xuczhang  阅读(174)  评论(0编辑  收藏  举报

 

2 Types of socket

1) stream socket: TCP (telnet)

2) datagram socket: UDP (tftp,dhcpcd)

image

Encapulate and Strip

 

Ipv6

image

Port Number

/etc/services records the well-known port number services.

 

Byte Order

image

 

Structs

1. socket descriptor: int

2. struct addrinfo

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
};

call getaddrinfo() to get a addrinfo struct

3. sockaddr

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

IPv4: sockaddr_in

IPv6: sockaddr_in6

both sockaddr_in and sockaddr_in6 can be casted to sockaddr directly.

// (IPv4 only--see struct sockaddr_in6 for IPv6)
 
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
};
 
// Internet address (a structure for historical reasons)
struct in_addr {
    uint32_t s_addr; // that's a 32-bit int (4 bytes)
};

 

// (IPv6 only--see struct sockaddr_in and struct in_addr for IPv4)
 
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
};

 

4.