网络工具及转换函数
常用的开发工具
常用函数
socket()
:- 创建套接字:
1
int sockfd = socket(int domain, int type, int protocol);
domain
:指定协议族,如AF_INET
(IPv4)或AF_INET6
(IPv6)。type
:指定套接字类型,如SOCK_STREAM
(TCP)或SOCK_DGRAM
(UDP)。protocol
:指定传输协议,通常设为0以选择默认协议。sockfd
:创建成功后返回的套接字文件描述符,用于后续的网络操作。
- 创建套接字:
bind()
:- 绑定地址:
1
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
sockfd
:要绑定的套接字。addr
:指向sockaddr
结构的指针,指定要绑定的本地地址和端口。addrlen
:地址结构的大小。
- 绑定地址:
TCP 和 UDP 数据发送与接收接口
协议 | 接口 | 函数原型 | 头文件 | 功能描述 |
---|---|---|---|---|
TCP | 发送 | ssize_t send(int sockfd, const void *buf, size_t len, int flags); |
<sys/types.h> / <sys/socket.h> |
发送数据到指定的套接字。 |
TCP | 接收 | ssize_t recv(int sockfd, void *buf, size_t len, int flags); |
<sys/types.h> / <sys/socket.h> |
从指定的套接字接收数据。 |
UDP | 发送 | ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen); |
<sys/types.h> / <sys/socket.h> |
发送数据到指定的套接字,并指定目标地址。 |
UDP | 接收 | ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen); |
<sys/types.h> / <sys/socket.h> |
从指定的套接字接收数据,并获取源地址。 |
解释
sockfd
:发送数据的套接字。msg
:指向要发送的数据的指针。len
:数据长度。flags
:发送标志,通常设置为0。dest_addr
:指向目标地址的指针。addrlen
:目标地址的长度。buf
:指向存储接收到数据的缓冲区的指针。flags
:接收标志,通常设置为0。src_addr
:指向存储源地址的结构的指针。addrlen
:源地址结构的长度。
数据内容转换函数#include <unistd.h>
函数原型 | 头文件 | 功能描述 |
---|---|---|
htonl(uint32_t hostlong) |
<arpa/inet.h> |
将主机字节序的 uint32_t 转换为网络字节序。 |
htons(uint16_t hostshort) |
<arpa/inet.h> |
将主机字节序的 uint16_t 转换为网络字节序。 |
ntohl(uint32_t netlong) |
<arpa/inet.h> |
将网络字节序的 uint32_t 转换为主机字节序。 |
ntohs(uint16_t netshort) |
<arpa/inet.h> |
将网络字节序的 uint16_t 转换为主机字节序。 |
数据内容的读写
read()
: 从网络套接字中读取数据。它会从指定的套接字描述符中读取数据到提供的缓冲区。函数原型为:1
ssize_t read(int fd, void *buf, size_t count);
fd
: 网络套接字的描述符。buf
: 存储读取数据的缓冲区。count
: 要读取的字节数。
write()
: 将数据写入网络套接字。它会将提供的缓冲区的数据写入指定的套接字描述符。函数原型为:1
ssize_t write(int fd, const void *buf, size_t count);
fd
: 网络套接字的描述符。buf
: 要写入的数据的缓冲区。count
: 要写入的字节数。return value
:成功则返回写入的字节数,失败则返回-1
。
注意事项
阻塞模式: 默认情况下,
read()
和write()
可能会阻塞,直到有数据可读或数据被成功写入。如果需要非阻塞操作,可以设置套接字为非阻塞模式。错误处理: 在网络编程中,
read()
和write()
可能会因网络问题、连接关闭等原因返回错误。需要检查返回值和错误码以处理异常情况。数据边界:
read()
读取的数据量可能小于请求的count
,因此通常需要在循环中处理,直到读取到所需的字节数或遇到错误。
IP地址转换函数
函数原型 | 头文件 | 功能描述 |
---|---|---|
int inet_aton(const char *cp, struct in_addr *inp); |
<arpa/inet.h> |
将点分十进制的 IPv4 地址转换为二进制网络字节序并存储在 in_addr 结构中。 |
in_addr_t inet_addr(const char *cp); |
<arpa/inet.h> |
将点分十进制的 IPv4 地址转换为二进制网络字节序。若失败,返回 INADDR_NONE 。 |
char *inet_ntoa(struct in_addr in); |
<arpa/inet.h> |
将二进制网络字节序的 IPv4 地址转换为点分十进制字符串。 |
int inet_pton(int af, const char *src, void *dst); |
<arpa/inet.h> |
将文本形式的 IP 地址(IPv4 或 IPv6)转换为网络字节序。 |
const char *inet_ntop(int af, const void *src, char *dst, socklen_t size); |
<arpa/inet.h> |
将网络字节序的 IP 地址(IPv4 或 IPv6)转换为文本形式。 |
struct in_addr inet_makeaddr(in_addr_t net, in_addr_t host); |
<arpa/inet.h> |
生成 in_addr 结构,包含指定网络号和主机号的 IPv4 地址。 |
in_addr_t inet_lnaof(struct in_addr in); |
<arpa/inet.h> |
从 in_addr 结构中提取主机号。 |
in_addr_t inet_netof(struct in_addr in); |
<arpa/inet.h> |
从 in_addr 结构中提取网络号。 |
Port转换函数
函数原型 | 头文件 | 功能描述 |
---|---|---|
uint16_t htons(uint16_t hostshort); |
<arpa/inet.h> |
将主机字节序的 16 位端口号转换为网络字节序。 |
uint16_t ntohs(uint16_t netshort); |
<arpa/inet.h> |
将网络字节序的 16 位端口号转换为主机字节序。 |
工具
工具名 | 作用 |
---|---|
telnet + IP(常用本地环回ip) + port |
测试(本地)TCP连接 |
netstat
选项 | 描述 |
---|---|
-a |
显示所有连接中的套接字,包括监听(LISTEN)状态的套接字。 |
-n |
以数字形式显示地址和端口号,而不是尝试解析为主机名和服务名。 |
-t |
显示 TCP 连接。 |
-u |
显示 UDP 连接。 |
-l |
显示处于监听状态的套接字。 |
-p |
显示正在使用的套接字的程序和进程 ID(需要超级用户权限)。 |
-r |
显示内核的路由表信息。 |
-i |
显示网络接口列表和统计信息。 |
-s |
显示每个协议的统计信息,如 TCP、UDP、ICMP 等。 |
-c |
持续输出网络状态,每隔一段时间刷新显示,直到用户中断。 |
-e |
显示扩展的网络接口统计信息,包括字节数、包数等。 |
-v |
显示命令的详细信息,增加输出的冗长程度。 |
-W |
显示宽格式的输出,不会截断任何字段。 |
-g |
显示多播组信息。 |
网络工具及转换函数
https://weihehe.top/2024/08/16/工具/