zoukankan      html  css  js  c++  java
  • UNP学习第三章

    一、主机字节序和网络字节序

    转换时用到下列四个函数:

    #include <netinet/in.h>
    
    uint16_t htons(uint16_t host16bitvalue);
    uint32_t htonl(uint32_t host32bitvalue);
    均返回:网络字节序值
    uint16_t ntohs(uint6_t net16bitvalue);
    uint32_t ntohl(uint32_t net32bitvalue);
    均返回:主机字节序值

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

    二、字节操纵函数

    b打头源于4.2BSD,m打头源于ANSI C

    #include <strings.h>
    
    void bzero(void *dest, size_t nbytes);
    void bcopy(const void *src, void *dest, size_t nbytes);
    int bcmp(const void *ptr1, const void *ptr2, size_t nbytes);
    返回:0相等,非0不相等

    memset的第二个参数和第三个参数可能会写错,但编译器能通过。

    #include <string.h>
    
    void *memset(void *dest, int c, size_t len);
    void *memcpy(void *dest, const void *src, size_t nbytes);
    int memcmp(const void *ptr1, const void *ptr2, size_t nbytes);
    返回:0相同,>0或<0不相同

    三、inet_aton、inet_addr和inet_ntoa函数

    #include <arpa/inet.h>
    
    int inet_aton(const char *strptr, struct in_addr *addrptr);
    返回:1串有效,0串有错
    strptr:C字符串
    addrptr:转换成网络字节序后存储到指针中
    in_addr_t inet_addr(
    const char *strptr); 返回:若成功,返回32位二进制的网络字节序地址;若有错,则返回INADDR_NONE
    strptr:C字符串
    char *inet_ntoa(struct in_addr inaddr); 返回:指向点分十进制数串的指针
    inaddr:网络字节序结构

    四、inet_pton和inet_ntop函数

    #include <arpa/inet.h>
    
    int inet_pton(int family, const char *strptr, void *addrptr);
    返回:1成功,0输入不是有效的表达式,-1出错
    family:即可以是AF_INET,也可以是AF_INET6
    strptr:字符串
    addrptr:指针存放二进制的结果

    const char *inet_ntop(int family, const void *addrptr, char *strptr, size_t len); 返回:指向结果的指针——成功,NULL——出错
    family:
    即可以是AF_INET,也可以是AF_INET6
    addrptr:需要转换的网络字序
    strptr:字符串表达式
    len:长度,避免溢出缓冲区

     p代表表达(presentation),n代表数值(numeric)

    五、sockt_ntop和相关函数

    IPv4写法
    struct
    sockaddr_in addr; inet_ntop(AF_INET, &addr.sin_addr, str, sizeof(str));
    IPv6写法
    struct sockaddr_in6 addr6; inet_ntop(AF_INET6, &addr6.sin6_addr, str, sizeof(str));

    我们还未操作套接口地址结构定义了几个其他的函数,它们将简化我们的代码在IPv4与IPv6间的移植

    #include "unp.h"
    
    int sock_bind_wild(int sockfd, int family);
    返回:0成功,-1出错
    捆绑通配地址和一个临时端口到一个套接口
    int sock_cmp_addr(const struct sockaddr *sockaddr1, const struct sockaddr *sockaddr2, socklen_t addrlen); 返回:0地址同族且相等,否则非0
    比较两个套接口地址结构的地址部分
    int sock_cmp_port(const struct sockaddr *sockaddr1, const struct sockaddr *sockaddr2, socklen_t addrlen); 返回:0地址同族且端口相同,否则非0
    比较两个套接口地址结构中的端口部分
    int sock_get_port(const struct sockaddr *sockaddr, socklen_t addrlen); 返回:非负端口号sockaddr为IPv4或IPv6地址族,否则-1
    返回端口号
    char *sock_ntop_host(const struct sockaddr *sockaddr, socklen_t addrlen); 返回:非空指针成功,空指针出错
    将套接口地址结构中的主机部分转换成表达格式(不包括端口号)
    void sock_set_addr(const struct sockaddr *sockaddr, socklen_t addrlen, void *ptr);
    将套接口地址结构中的地址部分置为指针ptr所指的值。
    void sock_set_port(const struct sockaddr *sockaddr, socklen_t addrlen, int port);
    只设置套接口地址结构的端口号
    void sock_set_wild(struct sockaddr * sockaddr, socklen_t addrlen);
    将套接口地址结构中的地址部分分置为通配地址

    六、readn、writen和readline函数

    当我们对字节流套接口进行读或写操作时,调用下面的三个函数

    #include "unp.h"
    
    ssize_t readn(int filedes, void *buff, size_t nbytes);
    ssize_t written(int filedes, const void *buff, size_t nbytes);
    ssize_t readline(int filedes, void *buff, size_t maxlen);
    均返回:读写字节数,-1出错
    filedes:文件描述符
    buff:缓冲区
    nbytes:需要读写的字节长度
    maxlen:最大行长度

     readline每读取一个字节的数据就要调用一次系统的read函数,其效率时非常低的。

    七、isfdtype函数

    #include <sys/stat.h>
    int isfdtype(int fd, int fdtype);
    返回:1指定类型,0不是指定类型,-1出错
    fd:文件描述符
    fdtype:文件类型
    无欲速,无见小利。欲速,则不达;见小利,则大事不成。
  • 相关阅读:
    加入页面切换动画, 避免冷启动
    Spark Shuffle模块——Suffle Read过程分析
    java使用线程请求訪问每次间隔10分钟连续5次,之后停止请求
    二叉排序树(BST)构造与应用
    L贪心基础
    leetcode笔记:Ugly Number II
    Android API Guides---Layouts
    红外目标图像中阈值切割方法的比較与研究
    IOS开发证书变成“此证书的签发者无效”解决方法
    Web前端开发规范收集
  • 原文地址:https://www.cnblogs.com/ch122633/p/8336131.html
Copyright © 2011-2022 走看看