【c语言】打开一个socket服务端listen 描述符

来源:互联网 发布:搜狗排名优化 编辑:程序博客网 时间:2024/05/29 10:23
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;}
阅读全文
1 0
原创粉丝点击