免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1941 | 回复: 1
打印 上一主题 下一主题

求助!关于兼容IPV4和IPV6的网络编程问题,与地址簇无关 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-06-11 10:41 |只看该作者 |倒序浏览
本帖最后由 guaguaguaguaxi 于 2010-06-11 10:43 编辑

如题,我想实现一个与地址簇无关的网络编程,我在网上一段代码说是可以实现:
服务器端:
#include <sys/types.h>

#include <sys/socket.h>

#include <netinet/in.h>

#include <netdb.h>

#include <stdio.h>

#include <errno.h>

#include <unistd.h>

#include <string.h>

#include <stdlib.h>

#include <arpa/inet.h>



#define MAXSOCK 20



int main_P((int,char **));



int main(argc,argv)

        int agrc;

        char **argv;

{

        struct addrinfo hints,*res,*res0;

        int error;

        struct sockaddr_storage from;

        socklen_t fromlen;

        int ls;

        int s[MAXSOCK];

        int smax;

        int sockmax;

        fd_set rfd,rfd0;

        int n;

        int i;

        char hbuf[NI_MAXHOST],sbuf[NI_MAXSERV];

#ifdef IPV6_V6ONLY

        const int on=1 ;

#endif

if(argc!=2){

         fprintf(stderr,”usage:test port\n”);

         exit(1);

       }



memset(&hints,0,sizeof(hints)) ;

       hints.ai_socktype=SOCK_STREAM;

       hints.ai_flags=AI_PASSIVE;

       error=getaddinfo(NULL,argv[1],&hints,&res0);

       if(error){

          fprintf(stderr,”%s %s\n”,argv[1], gai_strerror(error));

          exit(1);

}



smax=0;

sockmax=-1;

for(res=res0;res &&smax rMAXSOCK; res=res->ai_next){

     s[smax]=socket(res-ai_family,res-ai_socktype,res->ai_protocol);

   if(s[smax]<0  continue;



/*避免FD_SET溢出*/

if(s[smax]=FD_SETSIZE){

   close(s[smax]);

   s[smax]=-1;

   continue;

}

#ifdef IPV6_V6ONLY

       if(res->ai_family= =AF_INET6 &&

setsockopt(s[smax],IPPROTO_IPV6,IPV6_V6ONLY,&on,

sizeof(on))<0){

   perror(“bind”);

   s[smax]=-1;

   continue;

}

#endif

         

            if(bind(s[smax],res-ai_addr,res-ai_addrlen) 0){

                  close(s[smax]);

                  s[smax]=-1;

                  continue;

         }

         if(listen(s[smax],5) 0){

                  close(s[smax]);

                  s[smax]=-1;

                  continue;

         }



         error=getnameinfo(res-ai_addr,res-ai_addrlen,hbuf,sizeof(hbuf),sbuf,sizeof(sbuf),

                  NI_NUMERICHOST | NI_NUMERICSERV);

         if(error){

fprintf(stderr,”test:%s\n”,gai_strerror(error));

            exit(1);

         }

         fprintf(stderr,”listen to %s %s \n”,hbuf,sbuf);



         if(s[smax]>sockmax)

           sockmax=s[smax];

         samx++;

    }



    if(smax= =0){

         fprintf(stderr,”test:no socket to listen to\n”);

         exit(1);

    }



    FD_ZERO(&rfd0);

    for(i=0;i<smax;i++)

         FD_SET(s,&rfd0);

     while(l){

         rfd=rfd0;

         n=select(sockmax+1,&frd,NULL,NULL,NULL);

         if(n<0){

           perror(“select”);

           exit(1);

         }

         fro(i=0;i<smax;i++){

           if(FD_ISSET(s,&rfd)){

               fromlen=sizeof(from);

               ls=accept(s,(struct sockaddr *)&from &fromlen);

            if(ls<0)   continue;

            write(ls,”hello\n”,6);

            close(ls);

          }

      }

   }

}

上面代码中的socket是用数组表示的s[MAXSOCK],我不太明白这里用数组的原因,我在其他地方有看到过只用一个句柄表示的,不用数组,是不是如果我想实现同时用IPV4,IPV6访问就得使用数组来表示??因为我现在想实现的就是同时用IPV4,IPV6访问服务器端,望大家替我解答一下,不胜感激.

论坛徽章:
0
2 [报告]
发表于 2010-06-11 15:20 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP