在 Linux 中,sockaddr
是一个通用结构体,用于表示网络地址
sockaddr_in
转换为 sockaddr
:#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
// 假设你已经有一个 sockaddr_in 结构体变量
struct sockaddr_in sin;
// 填充 sin 结构体
sin.sin_family = AF_INET;
sin.sin_port = htons(8080);
inet_pton(AF_INET, "127.0.0.1", &(sin.sin_addr));
// 将 sockaddr_in 转换为 sockaddr
struct sockaddr sa;
memcpy(&sa, &sin, sizeof(sin));
sockaddr
转换为 sockaddr_in
:#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
// 假设你已经有一个 sockaddr 结构体变量
struct sockaddr sa;
// 填充 sa 结构体
sa.sa_family = AF_INET;
// 将 sockaddr 转换为 sockaddr_in
struct sockaddr_in sin;
memcpy(&sin, &sa, sizeof(sa));
// 现在你可以使用 sin 结构体的成员了
int port = ntohs(sin.sin_port);
char ip[INET_ADDRSTRLEN];
inet_ntop(AF_INET, &(sin.sin_addr), ip, INET_ADDRSTRLEN);
注意:在这些示例中,我们使用了 memcpy
函数来复制内存。这是因为 sockaddr
和 sockaddr_in
结构体的大小可能不同(例如,sockaddr_in
包含一个额外的 sin_len
成员)。在使用这些方法时,请确保正确处理结构体的大小。