#include <netinet/in.h>

#include ,这是一个标准的网络编程头文件,用于定义 IP 地址、协议以及与网络接口相关的数据结构和常量。它主要用于在基于 IPv4 和 IPv6 的网络编程中。

#include 的作用

头文件包含了处理网络地址的定义和一些网络协议的相关常量,用于支持基于 IP(特别是 IPv4 和 IPv6)的网络编程。它提供了一些关键的数据结构和宏,如:

常见的结构和宏:

struct sockaddr_in:用于表示 IPv4 地址的结构体,常用于定义套接字绑定或连接的地址。

struct sockaddr_in {
    sa_family_t    sin_family;  // 地址族 (AF_INET)
    in_port_t      sin_port;    // 端口号 (使用 htons() 来转换字节序)
    struct in_addr sin_addr;    // IP 地址
};
  • struct sockaddr_in6:用于表示 IPv6 地址的结构体。

  • struct in_addr:用于存储 IPv4 地址。

struct in_addr {
    uint32_t s_addr;  // 32 位 IPv4 地址 (使用 inet_addr() 等函数设置)
};
  • INADDR_ANY:表示通配的 IPv4 地址,通常用于服务器套接字,表示绑定到所有可用的网络接口。

  • htons()ntohs():用于在主机字节序和网络字节序之间转换 16 位短整数(通常用于端口号)。

  • inet_addr()inet_ntoa():用于在点分十进制的 IPv4 地址和二进制格式之间进行转换。

示例代码:

以下是一个简单的示例,展示如何使用 netinet/in.h 中的结构体和函数:

#include 
#include 
#include 
#include 
#include 

int main() {
    // 创建一个套接字
    int sockfd = socket(AF_INET, SOCK_STREAM, 0);
    if (sockfd < 0) {
        std::cerr << "Failed to create socket\n";
        return -1;
    }

    // 定义服务器的地址结构体
    struct sockaddr_in server_addr;
    server_addr.sin_family = AF_INET;              // 使用 IPv4
    server_addr.sin_port = htons(8080);            // 指定端口号,使用 htons() 转换
    server_addr.sin_addr.s_addr = inet_addr("127.0.0.1");  // 指定服务器 IP 地址

    // 尝试连接服务器
    if (connect(sockfd, (struct sockaddr*)&server_addr, sizeof(server_addr)) < 0) {
        std::cerr << "Connection failed\n";
        close(sockfd);
        return -1;
    }

    // 发送数据
    const char* message = "Hello, Server!";
    send(sockfd, message, strlen(message), 0);

    // 关闭套接字
    close(sockfd);
    return 0;
}

在这个示例中, 中的 sockaddr_ininet_addr() 被用来设置服务器的 IP 地址和端口号。

你可能感兴趣的:(c++,socket)