Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình C

Triển khai địa chỉ Socket IPv6 trong C: Hướng dẫn từng bước

Triển khai địa chỉ Socket IPv6 trong C: Hướng dẫn từng bước

Chúng ta đều biết địa chỉ IPv4. Với sự cạn kiệt IPv6, IPv6 được giới thiệu để cung cấp không gian địa chỉ lớn hơn. Bài viết thảo luận triển khai địa chỉ IPv6 cho socket trong C, giúp giao tiếp liền mạch trên mạng IPv6 và đảm bảo tương thích.

Hiểu về địa chỉ IPv6

Địa chỉ IPv6 là số 128-bit, cho 2^128 địa chỉ duy nhất. Dạng biểu diễn: aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa:aaaa (mỗi 'a' là 4 chữ số hex 0000-FFFF). Số 0 dẫn đầu trong khối 16-bit bị bỏ qua, dùng :: thay cho dãy 0 liên tiếp (ví dụ 2001:0DB8:0000:0000:0000:0000:0000:0001 viết thành 2001:DB8::1). IPv6 không phân biệt chữ hoa/thường, quy ước dùng chữ thường.

IPv6 dùng để định danh interface, định tuyến gói tin, giao tiếp thiết bị. Được gán thủ công hoặc tự động qua DHCPv6. Triển khai IPv6 socket trong C quan trọng để tương thích với cơ sở hạ tầng internet đang phát triển.

Các bước triển khai IPv6 Socket

  • Include các header cần thiết: sys/types.h, sys/socket.h, netinet/in.h, arpa/inet.h, stdio.h, stdlib.h, string.h, unistd.h.
  • Tạo socket IPv6: socket(AF_INET6, SOCK_STREAM, 0) cho TCP hoặc SOCK_DGRAM cho UDP.
  • Bind socket: dùng cấu trúc struct sockaddr_in6, gán sin6_family = AF_INET6, port, địa chỉ (in6addr_any cho mọi interface).
  • Listen: listen() chuẩn bị nhận kết nối.
  • Accept: accept() chấp nhận kết nối, trả về socket descriptor mới.

Ví dụ: Server IPv6

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#define PORT 7070
#define BACKLOG 5

int main() {
    int server_fd, new_socket;
    struct sockaddr_in6 server_addr, client_addr;
    socklen_t client_addr_len;

    // Tạo IPv6 socket
    server_fd = socket(AF_INET6, SOCK_STREAM, 0);
    if (server_fd == -1) {
        perror("Socket creation failed");
        exit(EXIT_FAILURE);
    }

    // Bind socket
    memset(&server_addr, 0, sizeof(server_addr));
    server_addr.sin6_family = AF_INET6;
    server_addr.sin6_port = htons(PORT);
    server_addr.sin6_addr = in6addr_any;
    if (bind(server_fd, (struct sockaddr*)&server_addr, sizeof(server_addr)) == -1) {
        perror("Socket bind failed");
        exit(EXIT_FAILURE);
    }

    printf("Listening for connections on IPv6 address ...\n");

    // Listen
    if (listen(server_fd, BACKLOG) == -1) {
        perror("Socket listen failed");
        exit(EXIT_FAILURE);
    }

    printf("Waiting for incoming connections ...\n");

    // Accept
    client_addr_len = sizeof(client_addr);
    new_socket = accept(server_fd, (struct sockaddr*)&client_addr, &client_addr_len);
    if (new_socket == -1) {
        perror("Socket accept failed");
        exit(EXIT_FAILURE);
    }

    printf("Connection successful on IPv6 address! \n");

    // Hiển thị IPv6 client
    char client_ip_str[INET6_ADDRSTRLEN];
    inet_ntop(AF_INET6, &(client_addr.sin6_addr), client_ip_str, INET6_ADDRSTRLEN);
    printf("Connected client IP: %s\n", client_ip_str);

    // Đóng socket
    close(new_socket);
    close(server_fd);
    return 0;
}

Kết quả:

$ gcc srr.c -o srr
$ ./srr
Listening for connections on IPv6 address ...
Waiting for incoming connections ...

Giải thích

Chương trình thiết lập IPv6 socket, bind port, listen, accept kết nối. Khi client kết nối, in thông báo thành công và hiển thị địa chỉ IPv6 của client. Cuối cùng đóng socket. Ví dụ cho phép giao tiếp với client qua mạng IPv6.

Kết luận

Triển khai IPv6 socket trong C bao gồm: tạo socket, bind địa chỉ/port, listen, accept, hiển thị địa chỉ client. Sử dụng đúng hàm và cấu trúc (sockaddr_in6, inet_ntop) để xử lý IPv6 hiệu quả.

Tác giả

Triển khai địa chỉ Socket IPv6 trong C: Hướng dẫn từng bước

Bamdeb Ghosh

Chuyên gia mạng không dây, phân tích Wireshark, am hiểu Android, Bluetooth, Linux, Python. Trang web: wifisharks.com