免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4931 | 回复: 0

[函数] sendto函数的使用 [复制链接]

论坛徽章:
0
发表于 2011-08-01 17:33 |显示全部楼层
我现在有个很奇怪的问题 自己在虚拟机上建立了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;
                                }
                        }
                }
          }





各位大大求救啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP