ICMP 获取时间戳 (原始套接字)

时间:2022-01-07 02:26:09
ICMP 获取时间戳 (原始套接字)View Code

函数及变量的解释:

WSADATA : 存储由WSAStartup函数返回的数据。

int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);

    启动异步套接字,加载运行库

  wVersionRequest : 高阶字段表示小版本号,低位字段表示主版本号

  lpWSAData:  指向WSADATA的指针。

int socket( int af, int type, int protocol);

  根据指定协议族、数据类型、协议来分配一个套接口

  af : 地址描述,目前仅支持AF_INET

  type :指定socket类型,SOCK_STREAM是面向连接的socket,SOCK_DGRAME是无连接的socket,SOCK_RAW是原始套接字,可以接收到本机网卡上的数据帧。

  protocol : 指定协议。IPPROTO_TCP , IPPROTO_UDP,IPPROTO_ICMP等等

sockaddr_in

  作为bind、connect、recvfrom、sendto函数中指明地址的信息。

  内部成员:

  short sin_family  指明协议族

  u_short sin_port  端口号,必须是网络字节流

  sin_addr 类型为in_addr,真正存储IP的是s_addr,s_addr其实就是一个 u_int 类型的数据,其中存储的IP地址为网络字节流形式。

in_addr

  in_addr 这个结构体中只有一个u_int的变量,用来存储网络字节顺序的IP地址

  既然只有一个变量,还定义个毛结构体,出了好多麻烦事

htons(u_short x)

  是将整型变量从主机字节顺序转变成网络字节顺序

ntohs(u_short x)

  将网络字节序的u_short x转变为主机字节序

ntohl(u_long x)

  将网络字节序的u_long x转变为主机字节序

in_addr_t   inet_addr(const char* strptr);

  in_addr_t = u_int

  如果字符串有效,把字符串转变为网络字节序的 IPV4地址,返回类型为u_int

gethostbyname(char * name)

  通过主机名获得主机的信息

hostent *p

  gethostbyname的返回类型

  char ** h_addr_list : 主机网络地址的指针,网络字节顺序,以字符串的形式描述一个IP地址,如果对sockaddr_in中存储IP地址的变量进行赋值,需要进行强制转换。

char *inet_ntoa(in_addr in)

  将一个in_addr 的网络字节流转换为点分十进制的IP地址

  注意 sockaddr_in.sin_addr的类型就是 in_addr,可以作为参数直接传进去

int sendto(SOCKET s,char *buf,int blen,int flags,sockaddr *to,int tlen);

  flags 用来改变sendto发送的形式

  适用于发送无连接的UDP数据包