网络编程入门03
Socket.h Socket.cc
class Socket实际上没有写什么东西,几乎都是在调用moduo::net::socket下的一些函数
出现了两个新的类 tcp_info 与 InetAddress
#define TCPI_OPT_TIMESTAMPS 1
#define TCPI_OPT_SACK 2
#define TCPI_OPT_WSCALE 4
#define TCPI_OPT_ECN 8
struct tcp_info {
__u8 tcpi_state; /* TCP状态 */
__u8 tcpi_ca_state; /* TCP拥塞状态 */
__u8 tcpi_retransmits; /* 超时重传的次数 */
__u8 tcpi_probes; /* 持续定时器或保活定时器发送且未确认的段数*/
__u8 tcpi_backoff; /* 退避指数 */
__u8 tcpi_options; /* 时间戳选项、SACK选项、窗口扩大选项、ECN选项是否启用*/
__u8 tcpi_snd_wscale : 4, tcpi_rcv_wscale : 4; /* 发送、接收的窗口扩大因子*/
__u32 tcpi_rto; /* 超时时间,单位为微秒*/
__u32 tcpi_ato; /* 延时确认的估值,单位为微秒*/
__u32 tcpi_snd_mss; /* 本端的MSS */
__u32 tcpi_rcv_mss; /* 对端的MSS */
__u32 tcpi_unacked; /* 未确认的数据段数,或者current listen backlog */
__u32 tcpi_sacked; /* SACKed的数据段数,或者listen backlog set in listen() */
__u32 tcpi_lost; /* 丢失且未恢复的数据段数 */
__u32 tcpi_retrans; /* 重传且未确认的数据段数 */
__u32 tcpi_fackets; /* FACKed的数据段数 */
/* Times. 单位为毫秒 */
__u32 tcpi_last_data_sent; /* 最近一次发送数据包在多久之前 */
__u32 tcpi_last_ack_sent; /* 不能用。Not remembered, sorry. */
__u32 tcpi_last_data_recv; /* 最近一次接收数据包在多久之前 */
__u32 tcpi_last_ack_recv; /* 最近一次接收ACK包在多久之前 */
/* Metrics. */
__u32 tcpi_pmtu; /* 最后一次更新的路径MTU */
__u32 tcpi_rcv_ssthresh; /* current window clamp,rcv_wnd的阈值 */
__u32 tcpi_rtt; /* 平滑的RTT,单位为微秒 */
__u32 tcpi_rttvar; /* 四分之一mdev,单位为微秒v */
__u32 tcpi_snd_ssthresh; /* 慢启动阈值 */
__u32 tcpi_snd_cwnd; /* 拥塞窗口 */
__u32 tcpi_advmss; /* 本端能接受的MSS上限,在建立连接时用来通告对端 */
__u32 tcpi_reordering; /* 没有丢包时,可以重新排序的数据段数 */
__u32 tcpi_rcv_rtt; /* 作为接收端,测出的RTT值,单位为微秒*/
__u32 tcpi_rcv_space; /* 当前接收缓存的大小 */
__u32 tcpi_total_retrans; /* 本连接的总重传个数 */
};
InetAddress是对socket的 sockaddr_in 和 sockaddr_in6的再次封装,调用::net::sockets下对一些函数的调用
struct hostent
{
char *h_name; //正式主机名
char **h_aliases; //主机别名
int h_addrtype; //主机IP地址类型:IPV4-AF_INET
int h_length; //主机IP地址字节长度,对于IPv4是四字节,即32位
char **h_addr_list; //主机的IP地址列表
};
#include <netdb.h>
struct hostent *gethostbyname(const char *name);
__thread是GCC内置的线程局部存储设施,存取效率可以和全局变量相比。__thread变量每一个线程有一份独立实体,各个线程的值互不干扰。可以用来修饰那些带有全局性且值可能变,但是又不值得用全局变量保护的变量。
__thread使用规则:只能修饰POD类型(类似整型指针的标量,不带自定义的构造、拷贝、赋值、析构的类型,二进制内容可以任意复制memset,memcpy,且内容可以复原),不能修饰class类型,因为无法自动调用构造函数和析构函数,可以用于修饰全局变量,函数内的静态变量,不能修饰函数的局部变量或者class的普通成员变量,且__thread变量值只能初始化为编译器常量(值在编译器就可以确定const int i=5,运行期常量是运行初始化后不再改变const int i=rand())