1. 主机与网络字节序转换函数
头文件:<netinet/in.h>
1.1 主机转网络
htons(uint16_t) // 16位
htonl(uint32_t) // 32位
1.2 网络转主机
ntohs(uint16_t) // 16位
ntohl(uint32_t) // 32位
2. 地址转换函数
头文件:<arpa/inet.h>
2.1 字符串转数值
inet_aton(const char*, struct in_addr*) // 字符串有效返回1,否则0
(已废弃)inet_addr(const char*) // 成功返回转换的数值,失败返回INADDR_NONE
// 可用于IPv6的新函数
inet_pton(int, const char*, void*) //(地址族参数, 要转换的字符串, 接收转换的数值)
2.2 数值转字符串
inet_ntoa(struct in_addr) //返回IP地址字符串
// 可用于IPv6的新函数
inet_ntop(int, const void*, char*, size_t) // (地址簇, 数值, IP字符串, sizeof(字符串)) 返回值也是指向该字符串的地址
3. 多种IO函数
1. send/recv
头文件:<sys/socket.h>
// (套接字, 要传输数据的缓冲地址, 传输的字节数, 指定可选项)
send(int, const void*, size_t, int) // 成功返回发送的字节数,失败-1
// 同上
recv(int, void*, size_t, int) // 返回值同上, 收到EOF返回0
可选项 | 含义 |
---|---|
MSG_OOB | 用于传输带外数据 |
MSG_PEEK | 验证输入缓冲中是否存在接受的数据 |
MSG_DONTROUTE | 数据传输过程中不参照路由表,在本地网络中寻找目的地 |
MSG_DONTWAIT | 调用I/O函数时不阻塞,用于使用非阻塞I/O |
MSG_WAITALL | 防止函数返回,直到接收全部请求的字节数 |
2. readv/writev (多个缓冲统一收发)
头文件:<sys/uio.h>
// (套接字, iovec结构体, 2数组长度) 文件或标准描述符也可用
writev(int, const struct iovec*, int) // 成功返回发送的字节数,失败-1
// 同上
readv(int, const struct iovec*, int) // 返回值同上
struct iovec
{
void* iov_base; // 缓冲地址
size_t iov_len; // 缓冲大小
}
4. 套接字半关闭函数
头文件:<sys/socket.h>
shutdown(int sock, int howto) //成功返回0,失败-1
howto可选参数:
------------: SHUT_RD // 断开输入流
------------: SHUT_WR // 断开输出流
------------: SHUT_RDWR // 同时断开IO流
5. FILE和文件描述符的相互转换
头文件:<stdio.h>
// (文件描述符, FILE模式(与fopen的打开模式相同))
fdopen(int fildes, const char* mode) // 转换为FILE, 成功返回FILE,失败NULL
fileno(FILE*) // 成功返回转换后的文件描述符,失败-1
6. 套接字可选项设置函数
头文件:<sys/socket.h>
// (套接字, 协议层, 选项名, 结果缓存地址, 4参数字节大小) 获取套接字可选项
getsockopt(int sock, int level, int opt, void*, socklen_t*) // 成功返回0,失败-1
// 参数,返回值同上, 设置套接字可选项
setsockopt(int, int, int, const void*, socklen_t)
7. IP地址与域名转换函数
头文件:<netdb.h>
gethostbyname(const char*) // 域名转IP 返回为hostent结构体,失败为NULL
gethostbyaddr(const char*, socklen_t, int) (IP地址,1大小, 地址簇) 返回值同上
可选性表可参考:可选项汇总表