• 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数据包

  • 相关阅读:
    java spring boot 跳转
    了解什么是 redis 的雪崩、穿透和击穿
    小白学k8s(12)-k8s中PV和PVC理解
    小白学k8s(11)-k8s中Secret理解
    小白学k8s(10)-k8s中ConfigMap理解
    小白学k8s(9)-gitlab-runner实现go项目的自动化发布
    小白学k8s(8)-Bazel部署go应用
    记go中一次http超时引发的事故
    小白学k8s(7)helm[v3]使用了解
    小白学k8s(6)使用kubespray部署k8s
  • 原文地址:https://www.cnblogs.com/jifahu/p/6785768.html
Copyright © 2020-2023  润新知