- 论坛徽章:
- 0
|
我现在有个很奇怪的问题 自己在虚拟机上建立了ntp的服务器 查看log 也发现其对于ipv6的地址端口进行了监听
但是实际上用我自己写的sntp客户端就死活连接不上 总是显示sendto:network unreachable 上网搜索教程 对于UDP的连接 都没有用IPV6的
我查了了linux的manual 觉得自己写的没有问题 理论上不应该有这样的结果啊
我才入职一个月 之前学的专业和工作基本没有什么关系 求解啊 多谢多谢
代码如下:
struct hostent h;
h = gethostbyname2(hostaddr,AF_INET6); //h通过gethostbyname2 获取关于ipv6的hostent,转换的到地址没有问题,我觉得不会是
//gethostbyname2的原因,其中hostaddr为调用过来的ipv6地址
if( h->h_addrtype == AF_INET6 )
{
to6.sin6_port = htons( 123 ); //ntp的端口号为123
to6.sin6_family = AF_INET6;
if( ( s = socket( PF_INET6, SOCK_DGRAM, 0 ) ) == -1 )
perror( "socket" ); //没有报错
poll_fd.fd = s;
poll_fd.events = POLLIN;
for(clist = h->h_addr_list; *clist != NULL; clist++ ){
memcpy( to6.sin6_addr.in6_u.u6_addr8, *clist, h->h_length );
// inet_pton(AF_INET6,"fe80::20c:29ff:fea2:9b9f",&to6.sin6_addr); //inet_pton得到的网络地址和
//gethostbuname2是一样的
retval = sendto( s, msg, strlen( msg ), 0, (struct sockaddr *) &to6, sizeof( struct sockaddr_in6)); //报错
if( retval == -1 )
perror( "sendto" );
if( recvtest = poll( &poll_fd, 1, 1000)){
sprintf(SystemCmd,"echo %d",recvtest);
system(SystemCmd);
rep_siz = recv( s, reply, sizeof( reply ), 0 );
sprintf(SystemCmd,"echo %d",rep_siz);
system(SystemCmd);
if( rep_siz == sizeof( reply ) ){
gmtime = ntohl( reply[10] ) - TIME1970;
ntp_time.tv_sec = gmtime + get_offset( gmtime, tz_index, auto_daylight);
ntp_time.tv_usec = 0;
settimeofday( &ntp_time, 0 );
if ( s >= 0 )
close(s);
return 1;
}
}
}
}
各位大大求救啊 |
|