c语言

C语言 sockaddr和sockaddr_in案例详解

小云
132
2023-08-09 17:05:17
栏目: 编程语言

sockaddr和sockaddr_in是用于存储网络地址信息的结构体,在C语言中用于套接字编程。

下面是对它们的详细解释和示例:

1. sockaddr结构体

struct sockaddr {

    unsigned short sa_family; // 地址族类型,如AF_INET(IPv4)或AF_INET6(IPv6)

    char sa_data[14];         // 地址数据

};

sockaddr结构体是一个通用的网络地址结构体,它包含了地址族类型和地址数据。

常见的地址族类型有AF_INET(IPv4)和AF_INET6(IPv6)。但是由于该结构体的地址数据部分是一个字符数组,所以无法直接访问其中的IP地址和端口号。

2. sockaddr_in结构体

struct sockaddr_in {

    short sin_family;          // 地址族类型,必须为AF_INET

    unsigned short sin_port;   // 16位端口号,使用htons()函数将主机字节序转换为网络字节序

    struct in_addr sin_addr;   // IPv4地址结构体

    char sin_zero[8];          // 填充字段,通常为0

};

struct in_addr {

    unsigned long s_addr;      // 32位IPv4地址,使用inet_addr()函数将点分十进制字符串转换为网络字节序的整数表示

};

sockaddr_in结构体是专门用于IPv4地址的网络地址结构体,它包含了地址族类型、端口号和IPv4地址。其中,sin_family必须设置为AF_INET,sin_port是一个16位的端口号,需要使用htons()函数将主机字节序转换为网络字节序。sin_addr是一个in_addr结构体,用于存储32位的IPv4地址,需要使用inet_addr()函数将点分十进制字符串转换为网络字节序的整数表示。

下面是一个示例,演示如何使用sockaddr_in结构体创建一个服务器端的套接字并绑定到指定的IP地址和端口:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <sys/socket.h>

#include <arpa/inet.h>

int main() {

    int socket_desc;

    struct sockaddr_in server_addr;

    // 创建套接字

    socket_desc = socket(AF_INET, SOCK_STREAM, 0);

    if (socket_desc == -1) {

        printf("无法创建套接字\n");

        return 1;

    }

    // 设置服务器地址和端口

    server_addr.sin_family = AF_INET;

    server_addr.sin_addr.s_addr = inet_addr("服务器IP地址");

    server_addr.sin_port = htons(服务器端口号);

    // 绑定套接字到指定的IP地址和端口

    if (bind(socket_desc, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {

        printf("绑定失败\n");

        return 1;

    } else {

        printf("绑定成功\n");

    }

    return 0;

}

通过以上示例,你可以了解如何使用sockaddr_in结构体创建一个服务器端的套接字并绑定到指定的IP地址和端口。

在实际应用中,还可以使用sockaddr_in结构体创建客户端的套接字并连接到服务器。


0
看了该问题的人还看了