java 监听ipv6的udp,无法在辅助接口上接收UDP / IPv6数据包

I have the following C code for UDP server which would bind to the ipv6 address of the secondary interface 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;

}

Device tap0 has following details:

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

I run the above code with the following command:

./server -A aaaa::1

But it's not able to listen to the messages coming to the address aaaa::1 on tap0. I can see the packets on the wireshark dump on tap0 interface. Interestingly, the server ran from the above command(and code) can receive the messages through the localhost. So, if I execute the following command, the server receives the messages:

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

The above command sending and reception is done through localhost.

Is there any way I can programatically receive UDP/IPv6 messages on secondary interfaces?

解决方案

The problem must be somewhere else. Using the code above I can successfully receive packets from another node using aaaa::1/64 and aaaa::2/64 as the local and remote addresses, respectively.

Try to bind to :: and see if it works that way. Also try to use netcat6 to bind to aaaa::1 and receive from another netcat6 instance.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值