溫馨提示×

Linux sockaddr在編程中怎么用

小樊
106
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
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女