• socket编程基础-字节序/IP/PORT转换/域名


    socket编程基础

    网络IP操作函数

    字符串的IP和32位的IP转换

    #include <sys/socket.h>

    #inlcude <netinet/in.h>

    #include <arpa/inet.h>

    • int inet_aton(const char *cp, struct in_addr *inp);
    • in_addr_t inet_addr(const char *cp);
    • in_addr_t inet_network(const char *cp);
    • char *inet_ntoa(struct in_addr in);
    • struct in_addr inet_makeaddr(int net, int host);
    • in_addr_t inet_lnaof(struct in_addr in);
    • in_addr_t inet_netof(struct in_addr in);

    • int inet_pton(int af, const char *src, void *dst);

    af:AF_INET, AF_INET6

    src:string IP, example:"192.168.103.116"

    dst:a network address

    return:成功1,src非法返回0,af非法地址返回-1,同时置errno为EAFNOSUPPORT。

    #define servip "192.168.1.103"

    inet_pton(AF_INET, servip, &servaddr.sin_addr.s_addr);


    推荐使用inet_pton()或inet_aton(),而非inet_addr()或inet_network(),因为返回值-1代表IP地址255.255.255.255。

    注:网络格式IP为二进制大端格式。

    字节转换函数

    • unsigned long int htonl(unsigned long int hostlong);
    • unsigned short int htons(unsigned short int hostshort);
    • unsigned long int ntohl(unsigned long int netlong);
    • unsigned short int ntohs(unsigned short int netshort);

    注:h代表host,n代表network,s代表short,l代表long

    IP和域名的转换

    • struct hostent gethostbyname(const char hostname);
    • struct hostent gethostbyaddr(const char addr, int len, int type);

    #define <netdb.h>

    struct hostent {

    char *h_name; //主机的正式名称

    char *h_aliases; //主机别名

    int h_addrtype; //主机的地址类型AF_INET

    int h_length; //主机的地址长度,IP4是4字节32位

    char **h_addr_list; //主机IP地址列表

    }

    #define h_addr h_addr_list[0]

    这两个函数失败返回NULL,且设置h_errno错误变量,h_strerror()可以得到详细的出错信息。

    服务信息函数

    在网络程序里面我们有时候需要知道端口,IP和服务信息。

    • int getsockname(int sockfd, struct sockaddr *localaddr, int *addrlen);
    • int getpeername(int sockfd, struct sockaddr *peeraddr, int *addrlen);
    • struct servent *getservbyname(const char *servname, const char *protoname);
    • struct servent *getservbyport(int port, const char protoname);

    struct servent {

    char *s_name; //正式服务名

    char **s_aliases; //别名列表

    int s_port; //端口号

    char *s_proto; //使用的协议

    }

  • 相关阅读:
    借助magicwindow sdk plugin快速集成sdk
    Deeplink做不出效果,那是你不会玩!
    iOS/Android 浏览器(h5)及微信中唤起本地APP
    C#回顾 Ado.Net C#连接数据库进行增、删、改、查
    C# 文件操作(全部) 追加、拷贝、删除、移动文件、创建目录 修改文件名、文件夹名
    C#中的静态方法|如何调用静态方法
    SpringBoot实体类对象和json格式的转化
    SpringBoot + kaptcha 生成、校对 验证码
    SpringBoot配置自定义美化Swagger2
    Spring Boot关于layui的通用返回类
  • 原文地址:https://www.cnblogs.com/embedded-linux/p/4984613.html
Copyright © 2020-2023  润新知