usa una siguientes redes que paquetes obligatorio las iaid entre diferencia dhcpv6 dhcpv4 cuál c udp localhost ipv6

c - una - iaid ipv6



No se pueden recibir paquetes UDP/IPv6 en la interfaz secundaria (1)

El problema debe ser en otro lugar. Utilizando el código anterior, puedo recibir paquetes de otro nodo con éxito utilizando aaaa :: 1/64 y aaaa :: 2/64 como direcciones locales y remotas, respectivamente.

Intenta enlazar con :: y ver si funciona de esa manera. También intente utilizar netcat6 para vincular a aaaa :: 1 y recibir de otra instancia de netcat6.

Tengo el siguiente código C para el servidor UDP que se uniría a la dirección ipv6 de la interfaz secundaria tap0.

context_t * new_context(const struct sockaddr *listen_addr, size_t addr_size) { context_t *c = malloc( sizeof( context_t ) ); time_t now; int reuse = 1; if (!listen_addr) { fprintf(stderr, "no listen address specified/n"); return NULL; } srand( getpid() ^ time(&now) ); if ( !c ) { perror("init: malloc:"); return NULL; } memset(c, 0, sizeof( context_t ) ); c->sockfd = socket(listen_addr->sa_family, SOCK_DGRAM, 0); if ( c->sockfd < 0 ) { perror("new_context: socket"); goto onerror; } if ( setsockopt( c->sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse) ) < 0 ) perror("setsockopt SO_REUSEADDR"); if ( bind (c->sockfd, listen_addr, addr_size) < 0 ) { perror("new_context: bind"); goto onerror; } return c; onerror: if ( c->sockfd >= 0 ) close ( c->sockfd ); free( c ); return NULL; } context_t * get_context(const char *ipaddress, const char *port, unsigned int scopeId) { int s; context_t* ctx; struct addrinfo hints; struct addrinfo *result, *rp; memset(&hints, 0, sizeof(struct addrinfo)); hints.ai_family = AF_UNSPEC; /* Allow IPv4 or IPv6 */ hints.ai_socktype = SOCK_DGRAM; /* Coap uses UDP */ hints.ai_flags = AI_PASSIVE | AI_NUMERICHOST | AI_NUMERICSERV | AI_ALL; s = getaddrinfo(ipaddress, port, &hints, &result); if ( s != 0 ) { fprintf(stderr, "getaddrinfo: %s/n", gai_strerror(s)); return NULL; } /* iterate through results until success */ for (rp = result; rp != NULL; rp = rp->ai_next) { ctx = new_context(rp->ai_addr, rp->ai_addrlen); if (ctx) { if ( rp->ai_family == PF_INET6 ) { struct sockaddr_in6* pSadrIn6 = (struct sockaddr_in6*) rp->ai_addr; if ( pSadrIn6->sin6_scope_id == 0 ) { pSadrIn6->sin6_scope_id = scopeId; } /* End IF the scope ID wasn''t set. */ } goto finish; } } fprintf(stderr, "no context available for interface ''%s''/n", node); finish: freeaddrinfo(result); return ctx; }

El dispositivo tap0 tiene los siguientes detalles:

tap0 Link encap:Ethernet HWaddr ce:23:fc:81:7f:65 inet6 addr: fe80::cc23:fcff:fe81:7f65/64 Scope:Link inet6 addr: aaaa::1/64 Scope:Global

Ejecuto el código anterior con el siguiente comando:

./server -A aaaa::1

Pero no puede escuchar los mensajes que llegan a la dirección aaaa :: 1 en tap0. Puedo ver los paquetes en el volcado de wireshark en la interfaz tap0. Curiosamente, el servidor ejecutado desde el comando anterior (y el código) puede recibir los mensajes a través del localhost. Entonces, si ejecuto el siguiente comando, el servidor recibe los mensajes:

nc -6 -vvv -u aaaa::1 61616 < /tmp/send_to_node_raw

El envío y recepción del comando anterior se realiza a través de localhost. ¿Hay alguna forma de que pueda recibir programáticamente mensajes UDP / IPv6 en interfaces secundarias?