网络工具及转换函数

常用的开发工具

常用函数

  1. 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:创建成功后返回的套接字文件描述符,用于后续的网络操作。
  2. 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

注意事项

  1. 阻塞模式: 默认情况下,read()write() 可能会阻塞,直到有数据可读或数据被成功写入。如果需要非阻塞操作,可以设置套接字为非阻塞模式。

  2. 错误处理: 在网络编程中,read()write() 可能会因网络问题、连接关闭等原因返回错误。需要检查返回值和错误码以处理异常情况。

  3. 数据边界: 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/工具/
作者
weihehe
发布于
2024年8月16日
许可协议