Linux IPv6 UDP套接字程式設計示例
阿新 • • 發佈:2019-01-22
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
參考資料: