POSIX-Data Structure

struct sigevent

The <signal.h> header shall define the sigevent structure, which shall include at least the following members:

struct sigevent {
    int           sigev_notify;            //Notification type. 
    int           sigev_signo;            //Signal number. 
    union sigval  sigev_value;             //Signal value. 
    void         (*sigev_notify_function)(union sigval); //Notification function. 
    pthread_attr_t *sigev_notify_attributes;  //Notification attributes. 
}; 

sigev_notify

 sigev_notify 的取值范围如下,只有3种情况(对应的宏在<signal.h>中定义)。

SIGEV_NONE
事件发生时,什么也不做.
SIGEV_SIGNAL
事件发生时,将sigev_signo 指定的信号(A queued signal)发送给指定的进程.
SIGEV_THREAD
事件发生时,内核会(在此进程内)以sigev_notification_attributes为线程属性创建一个线程,并且让它执行sigev_notify_function
传入sigev_value作为为一个参数.

sigev_signo

 在sigev_notify = SIGEV_SIGNAL 时使用,指定信号的种别(number).

sigev_value

sigev_notify = SIGEV_THREAD 时使用,作为sigev_notify_function 的参数.

union sigval
{
    int sival_int;
    void *sival_ptr;
};  

(*sigev_notify_function)(union sigval)

函数指针(指向通知执行函数),在sigev_notify = SIGEV_THREAD 时使用, 其他情况下置为NULL.

sigev_notify_attributes

指向线程属性的指针,在sigev_notify = SIGEV_THREAD 时使用,指定创建线程的属性, 其他情况下置为NULL. 


 

strcut timespec

The <time.h> header shall declare the timespec structure, which shall include at least the following members: 

struct timespec 
{
    time_t tv_sec;        /* Seconds */
    long   tv_nsec;        /* Nanoseconds(纳秒:十亿分之一秒) */
};

 

 


 

struct itimerspec

The <time.h> header shall also declare the itimerspec structure, which shall include at least the following members:

struct itimerspec 
{
    struct timespec it_interval;  /* Timer interval(timer循环时间间隔) */
    struct timespec it_value;     /* Initial expiration(timer初次到期时间间隔) */
};

 

 


 

clockid_t

clockid_t is used for clock ID type in the clock and timer functions, 取值范围如下(前4个是POSIX定义的,灰色部分为Linux的扩展),

/* Identifier for system-wide realtime clock, Setting this clock requires appropriate privileges */
#define CLOCK_REALTIME        0
/* Monotonic system-wide clock, Clock that cannot be set and represents monotonic time since some unspecified starting point  */
#define CLOCK_MONOTONIC        1
/* High-resolution timer from the CPU. (since Linux 2.6.12) */
#define CLOCK_PROCESS_CPUTIME_ID  2    
/* Thread-specific CPU-time clock. (since Linux 2.6.12) */
#define CLOCK_THREAD_CPUTIME_ID    3
/* Monotonic system-wide clock, not adjusted for frequency scaling.  */
#define CLOCK_MONOTONIC_RAW        4
/* Identifier for system-wide realtime clock, updated only on ticks.  */
#define CLOCK_REALTIME_COARSE    5
/* Monotonic system-wide clock, updated only on ticks.  */
#define CLOCK_MONOTONIC_COARSE    6

CLOCK_REALTIME : 这种时钟表示的是绝对时间, 指的是从1970年1月1月0:00到目前经过多少秒, 相当于你的linux系统中显示的时间, 所以这个时间是可以更改的, 当系统的时钟源被改变,或者系统管理员重置了系统时间之后,这种类型的时钟可以得到相应的调整, 对设定为此类型的timer是有影响的.

CLOCK_MONOTONIC : 这种时钟表示的是相对时间, 其值对通过累积时钟节拍(嘀嗒)计算出来的, 不受时钟源等的影响, 从系统启动这一刻起开始计时, 如果你想计算出在一台计算机上不受重启的影响,两个事件发生的间隔时间的话,那么它将是最好的选择。

CLOCK_PROCESS_CPUTIME_ID : 测量调用进程(包括该进程内所有的线程)用户和系统消耗的总CPU时间.

CLOCK_THREAD_CPUTIME_ID : 测量调用线程消耗的CPU时间.

 


 

struct timeval

The <sys/time.h> header shall define the timeval structure, which shall include at least the following members:

struct timeval
{
    time_t         tv_sec;    // Seconds(秒). 
    suseconds_t    tv_usec;   // Microseconds(微秒:千分之一毫秒). 
};

 

 


 

 

struct itimerval

The <sys/time.h> header shall define the itimerval structure, which shall include at least the following members:

struct itimerval
{
    struct timeval it_interval;  /* Timer interval(timer循环时间间隔) */
    struct timeval it_value;     /* Initial expiration(timer初次到期时间间隔) */
};

 

 


 

strcut tm

The <time.h> header shall declare the tm structure, which shall include at least the following members:

struct tm
{
    int    tm_sec   //Seconds [0,60]. 60 is used for leap seconds.
    int    tm_min   //Minutes [0,59]. 
    int    tm_hour  //Hour [0,23]. 
    int    tm_mday  //Day of month [1,31]. 
    int    tm_mon   //Month of year [0,11]. 
    int    tm_year  //Years since 1900. 
    int    tm_wday  //Day of week [0,6] (Sunday =0). 
    int    tm_yday  //Day of year [0,365]. The number of days since January 1 
    int    tm_isdst //Daylight Savings flag(夏时令)
};

 

注意: 1)使用localtime等函数取得tm结构体,表示当前时间时, 年数要加1900,月数要加1;因为tm_year是1900的偏移量,tm_mon是从0开始计算的.

        2)tm_isdst是夏时令的标志, 大于0表示时间使用了夏时令, 0表示未使用夏时令,小于0表示没有相关信息.

 

 


 struct sockaddr

The <sys/socket.h> header shall define the sockaddr structure, which shall include at least the following members:

struct sockaddr
{
    sa_family_t  sa_family;   //Address family. 
    char         sa_data[14]; // Socket address (variable-length data). 
};

The sockaddr structure is used to define a socket address which is used in the bind(), connect(), getpeername(), getsockname(), recvfrom(), and sendto() functions.

 


 

struct sockaddr_in

The <netinet/in.h> header shall define the sockaddr_in structure, which shall include at least the following members:

typedef uint32_t in_addr_t;   /* Internet address. */

struct in_addr
{
    in_addr_t  s_addr;
};

struct sockaddr_in
{
    sa_family_t     sin_family;   //AF_INET. 
    in_port_t       sin_port;     //Port number(网络字节序). 
    struct in_addr  sin_addr;     //IP address(网络字节序).
};

 The sockaddr_in structure is used to store addresses for the Internet address family. Pointers to this type shall be cast by applications to struct sockaddr * for use with socket functions.


 

struct hostent

The <netdb.h> header shall define the hostent structure, which shall include at least the following members:

struct hostent
{
    char   *h_name;       //Official name of the host. 
    char  **h_aliases;    //主机的别名,可以有多个,最一个是空指针
    int     h_addrtype;   //Address type.always AF_INET or AF_INET6 at present.
    int     h_length;     //地址的长度(IPv4的长度为4字节). 
    char  **h_addr_list;  //IP地址,可以有多个,最后一个是空指针(网络字节序)
};
#define h_addr h_addr_list[0] /* for backward compatibility */

/* 注意事项
(1)h_aliases 和 h_addr_list 的用法见例子:http://www.cnblogs.com/LubinLew/p/Linux-gethostbyname.html (2)h_addr_list中存储的IP地址格式为点分10进制,因为是网络字节序,不能用printf直接打印出来,需要使用inet_ntop函数来转换
*/

 结构图示:


Ip Protocol

 

/* Standard well-defined IP protocols.  */
enum {
    IPPROTO_IP = 0,    /* Dummy protocol for TCP.  */
    IPPROTO_ICMP = 1,      /* Internet Control Message Protocol.  */
    IPPROTO_IGMP = 2,      /* Internet Group Management Protocol. */
    IPPROTO_IPIP = 4,      /* IPIP tunnels (older KA9Q tunnels use 94).  */
    IPPROTO_TCP = 6,       /* Transmission Control Protocol.  */
    IPPROTO_EGP = 8,       /* Exterior Gateway Protocol.  */
    IPPROTO_PUP = 12,      /* PUP protocol.  */
    IPPROTO_UDP = 17,      /* User Datagram Protocol.  */
    IPPROTO_IDP = 22,      /* XNS IDP protocol.  */
    IPPROTO_TP = 29,       /* SO Transport Protocol Class 4.  */
    IPPROTO_DCCP = 33,     /* Datagram Congestion Control Protocol.  */
    IPPROTO_IPV6 = 41,     /* IPv6 header.  */
    IPPROTO_RSVP = 46,     /* Reservation Protocol.  */
    IPPROTO_GRE = 47,      /* General Routing Encapsulation.  */
    IPPROTO_ESP = 50,      /* encapsulating security payload.  */
    IPPROTO_AH = 51,       /* authentication header.  */
    IPPROTO_MTP = 92,      /* Multicast Transport Protocol.  */
    IPPROTO_BEETPH = 94,   /* IP option pseudo header for BEET.  */
    IPPROTO_ENCAP = 98,    /* Encapsulation Header.  */
    IPPROTO_PIM = 103,     /* Protocol Independent Multicast.  */
    IPPROTO_COMP = 108,    /* Compression Header Protocol.  */
    IPPROTO_SCTP = 132,    /* Stream Control Transmission Protocol.  */
    IPPROTO_UDPLITE = 136, /* UDP-Lite protocol.  */
    IPPROTO_RAW = 255,     /* Raw IP packets.  */
    IPPROTO_MAX
};

 

 

 

 

 


 

struct addrinfo

The <netdb.h> header shall define the addrinfo structure, which shall include at least the following members:

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

/* ======================Types of sockets====================== */
enum __socket_type {
    SOCK_STREAM = 1,        /* Sequenced, reliable, connection-based byte streams.  */
    SOCK_DGRAM = 2,         /* Connectionless, unreliable datagrams of fixed maximum length.  */
    SOCK_RAW = 3,           /* Raw protocol interface.  */
    SOCK_RDM = 4,           /* Reliably-delivered messages.  */
    SOCK_SEQPACKET = 5,     /* Sequenced, reliable, connection-based,datagrams of fixed maximum length.  */
    SOCK_DCCP = 6,          /* Datagram Congestion Control Protocol.  */
    SOCK_PACKET = 10,       /* Linux specific way of getting packets at the dev level.  For writing rarp and other similar things on the user level. */
    
    /* Flags to be ORed into the type parameter of socket and socketpair and used for the flags parameter of paccept.  */
    SOCK_CLOEXEC =  02000000,   /* Atomically set close-on-exec flag for the new descriptor(s).  */
    SOCK_NONBLOCK = 00004000    /* Atomically mark descriptor(s) as non-blocking.  */
};

/* ============Protocol families(只列出常用几个)================= */
#define PF_UNSPEC       0   /* Unspecified.  */
#define PF_LOCAL        1   /* Local to host (pipes and file-domain).  */
#define PF_INET         2   /* IP protocol family.  */
#define PF_IPX          4   /* Novell Internet Protocol.  */
#define PF_APPLETALK    5   /* Appletalk DDP.  */
#define PF_INET6        10  /* IP version 6.  */
#define PF_TIPC         30  /* TIPC sockets.  */
#define PF_BLUETOOTH    31  /* Bluetooth sockets.  */

/* ==============Address families(只列出常用几个)================= */
#define AF_UNSPEC   PF_UNSPEC
#define AF_LOCAL    PF_LOCAL
#define AF_UNIX     PF_UNIX
#define AF_FILE     PF_FILE
#define AF_INET     PF_INET
#define AF_IPX      PF_IPX
#define AF_APPLETALK    PF_APPLETALK
#define AF_INET6    PF_INET6
#define AF_ROSE     PF_ROSE
#define AF_NETLINK  PF_NETLINK
#define AF_TIPC     PF_TIPC
#define AF_BLUETOOTH    PF_BLUETOOTH

/* ====Possible values for `ai_flags' field in `addrinfo' structure.===== */
#define AI_PASSIVE        0x0001  /* Socket address is intended for `bind'. */
#define AI_CANONNAME      0x0002  /* Request for canonical name. */
#define AI_NUMERICHOST    0x0004  /* Don't use name resolution. */
#define AI_V4MAPPED       0x0008  /* IPv4 mapped addresses are acceptable. */
#define AI_ALL            0x0010  /* Return IPv4 mapped and IPv6 addresses. */
#define AI_ADDRCONFIG     0x0020  /* Use configuration of this host to choose returned address type. */
#ifdef __USE_GNU
#define AI_IDN                      0x0040  /* IDN encode input (assuming it is encoded
                  in the current locale's character set) before looking it up. */
#define AI_CANONIDN                 0x0080  /* Translate canonical name from IDN format. */
#define AI_IDN_ALLOW_UNASSIGNED     0x0100 /* Don't reject unassigned Unicode code points. */
#define AI_IDN_USE_STD3_ASCII_RULES 0x0200 /* Validate strings according to STD3 rules. */
#endif
#define AI_NUMERICSERV              0x0400  /* Don't use name resolution.  */

/* =======================struct addrinfo======================= */
struct addrinfo {
int ai_flags;              /* 附加选项,多个选项可以使用或操作结合 */
int ai_family;             /* 指定返回地址的协议簇,取值范围:AF_INET(IPv4)、AF_INET6(IPv6)、AF_UNSPEC(IPv4 and IPv6) */ 
int ai_socktype;           /* enum __socket_type 类型,设置为0表示任意类型 */
int ai_protocol;           /* 协议类型,设置为0表示任意类型,具体见上一节的 Ip Protocol */
socklen_t ai_addrlen;      /* socket address 的长度 */
struct sockaddr *ai_addr;  /* socket address 的地址 */
char *ai_canonname;        /* Canonical name of service location. */
struct addrinfo *ai_next;  /* 指向下一条信息,因为可能返回多个地址 */
};

 

posted @ 2014-10-25 16:14  LubinLew  阅读(8283)  评论(0编辑  收藏  举报