温馨提示×

Linux sockaddr在编程中怎么用

小樊
81
2025-01-01 21:24:06
栏目: 智能运维

在 Linux 中,sockaddr 是一个通用结构体,用于表示网络地址

  1. 包含头文件:
#include <sys/socket.h>
  1. 定义 sockaddr 结构体:
struct sockaddr {
    sa_family_t sa_family; // 地址族,如 AF_INET(IPv4)或 AF_INET6(IPv6)
    char sa_data[14];     // 地址数据,长度可变
};
  1. 创建套接字:
int sockfd = socket(AF_INET, SOCK_STREAM, 0);
  1. 填充 sockaddr 结构体:

对于 IPv4 地址,可以使用以下结构体:

struct sockaddr_in {
    sa_family_t sin_family; // 地址族,如 AF_INET
    in_port_t sin_port;     // 端口号
    struct in_addr sin_addr; // IP 地址
};

填充 sockaddr_in 结构体:

struct sockaddr_in server_addr;
server_addr.sin_family = AF_INET;
server_addr.sin_port = htons(8080); // 端口号,使用 htons 函数转换为网络字节序
inet_pton(AF_INET, "127.0.0.1", &(server_addr.sin_addr)); // 将 IP 地址字符串转换为 in_addr 结构体

对于 IPv6 地址,可以使用以下结构体:

struct sockaddr_in6 {
    sa_family_t sin6_family; // 地址族,如 AF_INET6
    in_port_t sin6_port;     // 端口号
    struct in6_addr sin6_addr; // IP 地址
};

填充 sockaddr_in6 结构体:

struct sockaddr_in6 server_addr6;
server_addr6.sin6_family = AF_INET6;
server_addr6.sin6_port = htons(8080); // 端口号,使用 htons 函数转换为网络字节序
inet_pton(AF_INET6, "2001:db8::1", &(server_addr6.sin6_addr)); // 将 IP 地址字符串转换为 in6_addr 结构体
  1. 绑定套接字:
bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr));

注意:将 sockaddr 结构体强制转换为所需的类型(如 struct sockaddr_in 或 struct sockaddr_in6)。

  1. 监听连接:
listen(sockfd, 10);
  1. 接受连接:
struct sockaddr_in client_addr;
socklen_t client_addr_len = sizeof(client_addr);
int connfd = accept(sockfd, (struct sockaddr *)&client_addr, &client_addr_len);
  1. 与客户端通信:

可以使用 read()、write() 等函数与客户端进行数据交换。

  1. 关闭套接字:
close(connfd);
close(sockfd);

这就是在 Linux 编程中使用 sockaddr 的基本方法。根据实际需求,你可能需要对这些步骤进行调整。

0