温馨提示×

Linux sockaddr包含哪些信息

小樊
81
2025-01-01 21:17:05
栏目: 智能运维

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

  1. sa_family:地址族,表示地址的类型。常见的地址族有AF_INET(IPv4)和AF_INET6(IPv6)。
  2. sa_port:端口号,表示服务器监听的端口。它是一个16位的无符号整数。
  3. sa_addr:实际的网络地址。它的类型取决于sa_family的值。对于IPv4,它是一个in_addr结构体,包含一个32位的IPv4地址;对于IPv6,它是一个in6_addr结构体,包含一个128位的IPv6地址。

以下是一个简单的示例,展示了如何使用sockaddr结构体:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>

int main() {
    int sockfd;
    struct sockaddr_in server_addr, client_addr;
    socklen_t addr_len = sizeof(client_addr);

    // 创建一个TCP套接字
    sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    // 配置服务器地址
    server_addr.sin_family = AF_INET;
    server_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    server_addr.sin_port = htons(8080);

    // 绑定套接字到地址
    if (bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0) {
        perror("bind");
        exit(EXIT_FAILURE);
    }

    // 监听连接
    if (listen(sockfd, 10) < 0) {
        perror("listen");
        exit(EXIT_FAILURE);
    }

    // 接受客户端连接
    if (accept(sockfd, (struct sockaddr *)&client_addr, &addr_len) < 0) {
        perror("accept");
        exit(EXIT_FAILURE);
    }

    // 处理客户端请求(例如,发送响应)

    // 关闭套接字
    close(sockfd);

    return 0;
}

在这个示例中,我们创建了一个TCP套接字,绑定到所有可用的IPv4地址(0.0.0.0)的8080端口,然后监听客户端连接。当客户端连接时,我们接受连接并获取客户端的地址信息(client_addr)。

0