2024年4月17日发(作者:)
&val, sizeof(val)) < 0) {
printf("setsockopt(SO_REUSEADDR): %mn");
ret = -1;
goto out;
}
if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_RECVPKTINFO,
&val, sizeof(val)) < 0) {
printf("setsockopt(IPV6_RECVPKTINFO): %mn");
ret = -1;
goto out;
}
val = DHCPV6_HOP_COUNT_LIMIT;
if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
&val, sizeof(val)) < 0) {
printf("setsockopt(IPV6_MULTICAST_HOPS): %mn");
ret = -1;
goto out;
}
val = 0;
if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
&val, sizeof(val)) < 0) {
printf("setsockopt(IPV6_MULTICAST_LOOP): %mn");
ret = -1;
goto out;
}
if (bind(sock->fd, (struct sockaddr*)&bind_addr,
sizeof(bind_addr)) < 0) {
printf("bind(): %mn");
ret = -1;
goto out;
}
ifindex = if_nametoindex(sock->ifname);
if (ifindex) {
memset(&mreq, 0, sizeof(mreq));
inet_pton(AF_INET6, ALL_DHCPV6_RELAYS, &6mr_multiaddr);
6mr_interface = ifindex;
if (setsockopt(sock->fd, IPPROTO_IPV6, IPV6_ADD_MEMBERSHIP,
&mreq, sizeof(mreq)) < 0) {
printf("setsockopt(IPV6_ADD_MEMBERSHIP): %mn");
ret = -1;
goto out;
}
} else {
printf("get ifindex failed! ifname:%sn", sock->ifname);
}
out:
if (ret < 0 && sock->fd >= 0) {
close(sock->fd);
sock->fd = -1;
}
return ret;
}
int socket_recv(struct socket_st *sock)
{
struct sockaddr_in6 send_addr6;
char buf[BUFF_LEN], str[INET6_ADDRSTRLEN];;
int recv_size, buf_len;
while(1) {
memset(&send_addr6, 0, sizeof(send_addr6));
recv_size=recvfrom(sock->fd, buf, BUFF_LEN, 0, (struct sockaddr *)&send_addr6, &buf_len);
if(recv_size < 0){
printf("recvfrom error!n");
return -1;
}
if(inet_ntop(AF_INET6, &send_addr6, str, INET6_ADDRSTRLEN) == NULL){
perror("inet ntop/n");
printf("errorn");
}
printf("send_addr6=%sn", str);
}
return 0;
}
int main()
发布评论