简单封装一个linux socket服务端的listenfd初始化函数,方便快速调用:
/*创建 socket, 初始化lfd */
int initlistensocket(short port, int listen_limit, int non_block)
{
struct sockaddr_in sin;
int lfd = -1;
if((lfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
fprintf(stderr, "%s: socket init failed, %s\n", __func__, strerror(errno));
return -1;
}
//将socket设为非阻塞
if(non_block && fcntl(lfd, F_SETFL, O_NONBLOCK) < 0){
fprintf(stderr, "%s: fcntl nonblocking failed, %s\n", __func__, strerror(errno));
return -1;
}
memset(&sin, 0, sizeof(sin)); //bzero(&sin, sizeof(sin))
sin.sin_family = AF_INET;
sin.sin_addr.s_addr = INADDR_ANY;
sin.sin_port = htons(port);
if(bind(lfd, (struct sockaddr *)&sin, sizeof(sin)) < 0){
fprintf(stderr, "%s: bind failed, %s\n", __func__, strerror(errno));
return -1;
}
if(listen(lfd, listen_limit) < 0){
fprintf(stderr, "%s: listen failed, %s\n", __func__, strerror(errno));
return -1;
}
return lfd;
}
initlistensocket()参数说明
short port
—— 服务器开启的监听端口int listen_limit
—— listen()函数的连接队列容量(两队列总容量)int non_block
—— 置1则listenfd设为非阻塞,置0则默认阻塞
initlistensocket()返回值
成功调用的情况下返回监听文件描述符, 出错则打印errno并返回-1;