1. 程式人生 > >Linux IPv6 UDP套接字程式設計示例

Linux IPv6 UDP套接字程式設計示例

     udp ipv6套接字程式設計和ipv4介面類似,引數略有不同,流程都包括建立套接字、繫結地址、傳送等。

下面是一個udp ipv6 demo, 包括建立ipv6套接字、繫結地址和傳送資料等。

首先先在linux上配置一個本地站點地址,然後使用這個地址傳送。

//linux上新增IPv6地址命令
sudo ip -6 addr add fd11::100/64 dev eth0
/*
 *  Description : IPv6 UDP套接字程式設計示例
 *  Author      : mason
 *  Date        : 201808
 */
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>

/* IPv6壓縮格式地址 */
static char src[] = "fd11::100";
static char dst[] = "fd11::200";

void main()
{
    int udp6_socket, ret, ttl, on, addr_len;
    struct sockaddr_in6 saddr;
    struct sockaddr_in6 daddr;
    char buffer[] = "Hello World6";

    /* 設定IPv6地址,這個函式支援三種IPv6地址格式,包括首選格式、壓縮格式和對映格式*/
    if ((inet_pton(AF_INET6, (char *)&src[0], &saddr.sin6_addr)) != 1)
    {
        printf("invalid ipv6 addr \r\n");
        return ;
    }

    if ((inet_pton(AF_INET6, (char *)&dst[0], &daddr.sin6_addr)) != 1)
    {
        printf("invalid ipv6 addr \r\n");
        return ;
    }    

    addr_len = sizeof(struct sockaddr_in6);
    saddr.sin6_family = AF_INET6;
    saddr.sin6_port = htons(30000);

    daddr.sin6_family = AF_INET6;
    daddr.sin6_port = htons(40000);

    /* 建立IPv6套接字,IPv6使用AF_INET6 */
    udp6_socket = socket(AF_INET6, SOCK_DGRAM, 0);
    if (udp6_socket == -1)
    {
        printf("create udp6_socket fail\r\n");
        return;
    }

    /* 繫結地址 */
    if (bind(udp6_socket, (struct sockaddr *)&saddr, addr_len))
    {
        printf("udp6 bind addr fail, err : %d\r\n", errno);
        close(udp6_socket);
        return;
    }

    /* 傳送 */
    ret = sendto(udp6_socket, &buffer[0], sizeof(buffer), 0, (struct sockaddr *)&daddr, addr_len);
    if (ret > 0)
    {
        printf("udp6 send %d bytes success \r\n", ret);
    }

    /* 關閉套接字 */
    close(udp6_socket);
    return;
}

Makefile:

udp6:
	$(CC) -o udp6 udp6_demo.c
clean:
	@rm -rf *.o udp6

參考資料: