UNP学习第三章
2024-09-06 02:59:39
一、主机字节序和网络字节序
转换时用到下列四个函数:
#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:文件类型
最新文章
- 重置EntityFramework数据迁移到洁净状态
- Picasso设置圆角
- ubuntu安装搜狗输入法
- service mysql start出错,mysql启动不了,解决mysql: unrecognized service错误
- Linux操作系统奥秘02-系统引导(GRUB)
- Linux常用性能检测命令解释
- setTimeout/setInterval执行时机
- react组件什么周期记录,转的
- LVS图解 ---阿里
- 提高mysql查询效率的六种方法
- efwplus框架
- UVA-11134-Fabled Rooks (结构排序+贪婪)
- Linux/Windows远程桌面
- spring 4 + hibernate 4 配置数据库事务
- Nestjs 微服务
- Linux下普通IO文件操作函数---C语言
- Bootstrap框架整理
- powerdesign连接Oracle&;Mysql
- ios开发 ad hoc怎么用
- python文件和目录操作方法大全(含实例)【python】
热门文章
- 如何在pycharm上创建分支,并且把它推送到远端仓库
- setNeedsDisplay和setNeedsLayout方法
- BZOJ 2761: [JLOI2011]不重复数字 set
- paper 164: Siamese网络--相似度量方法
- Appium运行报错:No Chromedriver found that can automate Chrome &#39;39.0.0&#39;
- python3安装pdfminer并使用
- python中的__init__
- 102.kaldi 斯坦福语音识别工具的编译
- python的列表与shell的数组
- 【GDAL】GDAL栅格数据结构学习笔记(一): 关于Metadata