- 论坛徽章:
- 0
|
本帖最后由 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访问服务器端,望大家替我解答一下,不胜感激. |
|