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

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

#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:文件类型

UNP学习第三章的更多相关文章

  1. Java基础知识二次学习--第三章 面向对象

    第三章 面向对象   时间:2017年4月24日17:51:37~2017年4月25日13:52:34 章节:03章_01节 03章_02节 视频长度:30:11 + 21:44 内容:面向对象设计思 ...

  2. Struts2框架学习第三章——Struts2基础

    本章要点 —  Struts 1框架的基本知识 — 使用Struts 1框架开发Web应用 —  WebWork框架的基本知识 — 使用WebWork框架开发Web应用 — 在Eclipse中整合To ...

  3. C#高级编程 (第六版) 学习 第三章:对象和类型

    第三章 对象和类型 1,类和结构 类存储在托管堆上 结构存储在堆栈上   2,类成员 类中的数据和函数称为类成员 数据成员 数据成员包括了字段.常量和事件   函数成员 方法:与某个类相关的函数,可以 ...

  4. C语言学习第三章

    写在课前,提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号!提醒自己写代码的时候一定要注意不能漏写符号! 今天主要学习掌握if...else条件结构,多重if条件 ...

  5. 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-1-Tensor

    参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 Tensor Tensor可以是一个数 ...

  6. 深度学习框架PyTorch一书的学习-第三章-Tensor和autograd-2-autograd

    参考https://github.com/chenyuntc/pytorch-book/tree/v1.0 希望大家直接到上面的网址去查看代码,下面是本人的笔记 torch.autograd就是为了方 ...

  7. UNP学习第13章 守护进程和inetd超级服务器

    Unix系统中的syslogd守护进程通常由某个系统初始化脚本启动,而且在系统工作期间一直运行. 源自Berkeley的syslogd实现在启动时执行以下步骤. (1)读取配置文件.通常为/etc/s ...

  8. UNP学习第六章(二)

    一.描述符就绪条件 对于引起select返回套接字“就绪”的条件我们必须讨论得更明确: (1)满足一下塞个条件中的仍和一个时,一个套接字准备好读. a)该套接字接收缓冲区中的数据字节数不大于等于套接字 ...

  9. UNP学习第五章(二)

    一.POSIX信号处理 信号:告知某进程发生了某个事件的通知(软中断),通常是异步的. 信号可以:由进程发给另一个进程,由内核发给某个进程. 设置信号处理办法,有三个选择: 1.写一个函数,在信号发生 ...

随机推荐

  1. 接口代码(requests库安装)

    一.   首先用cd:Scripts路径名命令,进入到python--Scripts目录下:然后键入pip install requests 进行安装,有可能会要求你升级pip,键入python -m ...

  2. Dataphin的代码自动化能力如何助力商业决策

    前言 随着大数据趋势的迅速增长,数据的重要性与日俱增,企业内看数据.用数据的诉求越来越强烈,其中最常见的就是各种经营报表数据:老板每日早晨9点准时需要看到企业核心的经营数据,以便进行企业战略及方向决策 ...

  3. Codeforces 831C--Jury Marks (思维)

    题目链接:http://codeforces.com/problemset/problem/831/C 题意:有一位参赛选手,我们不知道他初始或最后的成绩,但是知道k次评审所加(减)的分数,以及n个在 ...

  4. flutter动态列表

    在前面一篇总结flutter里面的列表组件ListView的时候,一直都是使用的静态数据,但是在实际的运用过程中,数据都是从后台获取的动态数据,不能再像前面那样写静态数据了,下面模拟一下如果使用动态数 ...

  5. LUOGU P3380 【模板】二逼平衡树(树套树)

    传送门 解题思路 这里写的是常数巨大的线段树套\(splay\),卡了半天常才过.首先线段树每个节点挂一个\(splay\),\(splay\)中的元素即为线段树管辖的区间中的数.对于操作\(1\), ...

  6. 查看IOS-app证书到期时间

    参照: iOS企业版证书到期 https://www.jianshu.com/p/44b0dc46ef37 如果不能十分确定每一个打出来的ipa的有效期(过期时间),而又需要关注它具体什么时候需要强制 ...

  7. DIV置底层或置最高层的方法下拉菜单被挡住

    网站常会用到一些 下拉菜单,,幻灯片,,,飘浮广告等. 但经常会发现.幻灯片会挡住下拉菜单或者飘浮广告微信开店等. 解决办法有下 第一,可将幻灯片所在DIV 置于最底层.添加CSS如下 style=& ...

  8. (转)关于SimpleDateFormat安全的时间格式化线程安全问题

    想必大家对SimpleDateFormat并不陌生.SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以调 ...

  9. Daily Life——团队冲刺博客——(领航篇)

    目录 领航目标 各个成员在 Alpha 阶段认领的任务 各个成员的具体任务安排 整个项目预期的任务量 团队成员贡献值的计算规则 燃尽图 Daily Life团队冲刺博客 领航目标 各个成员在 Alph ...

  10. Cocos2d-x之Menu

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. cocos2d-x菜单简介: 菜单也是游戏开发中的重要环节,一般游戏开始的第一个画面都是游戏主菜单,这些菜单包括,开始游戏,游戏设置,关卡 ...