#include <sys/socket.h> #include <errno.h> //type为sock的type,addr为已初始化好的sockaddr,alen为addr的长度,qlen为listen的第二个参数 //出错返回-1,正确返回listen后的套接字描述符 int initserver(int type,const struct sockaddr *addr,socklen_t alen,int qlen) { int fd,err; int reuse = 1;//开关 if((fd = socket(addr->sa_family,type,0)) < 0) { return -1; } if(setsockopt(fd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(int)) < 0) { err = errno; goto errout; } if(bind(fd,addr,alen) < 0) { err = errno; goto errout; } if(type == SOCK_STREAM || type == SOCK_SEQPACKET) { if(listen(fd,qlen) < 0) { err = errno; goto errout; } } return (fd); errout: close(fd); errno = err; return(-1); }