Linux IPv6 UDP套接字编程示例

标签: UDP  IPv6  网络编程

     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

 

参考资料:

1. linux error code 含义 https://blog.csdn.net/wangcg123/article/details/51218408 

2. man sendto https://linux.die.net/man/2/sendto

3. man socket https://linux.die.net/man/7/socket

4 linux 下ping6 https://blog.csdn.net/hansel/article/details/5304103

原文链接:加载失败,请重新获取