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()