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