int open_listenfdd(char *port){
struct addrinfo hints,*listp,*p;
int listenfd, optval = 1;
/* get a list of potential server address*/
memset(&hints,0,sizeof(struct addrinfo));
hints.ai_socktype = SOCK_STREAM; /* open a connection */
hints.ai_flags = AI_PASSIVE | AI_ADDRCONFIG; /* use a numeric prot arg */
hints.ai_flags |= AI_NUMERICSERV; /* recommended for connections */
getaddrinfo(NULL,port,&hints,&listp);
/* walk the list for one that we can bind to.*/
for(p = listp ; p; p = p->ai_next){
/* create a socket descriptor */
if((listenfd = socket(p->ai_family,p->ai_socktype,p->ai_protocol)) < 0){
continue;
}
/* eliminates "address already in use" error from bind*/
setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,
(const void *)&optval,sizeof(int));
/* bind the descriptor to the address */
if(bind(listenfd,p->ai_addr,p->ai_addrlen) == 0 ){
break; /* connect success */
}
close(listenfd); /* bind failed , try next*/
}
/* clean up */
freeaddrinfo(listp);
if(!p) /* no address worked */
return -1;
/* make it a listening socket ready to accept connection request*/
if(listen(listenfd,LISTENQ) < 0){
close(listenfd);
return -2;
}
return listenfd;
}
【c语言】打开一个socket服务端listen 描述符
最新推荐文章于 2022-05-27 18:30:55 发布