|
各位好,在网上众多介绍epoll模型处理网络连接的模型中
都是像以下这样的代码片段:
/* 开启 socket 监听 */
if ((listener = socket(PF_INET, SOCK_STREAM, 0)) == -1) {
perror("socket");
exit(1);
} else
printf("socket 创建成功!\n");
setnonblocking(listener);
bzero(&my_addr, sizeof(my_addr));
my_addr.sin_family = PF_INET;
my_addr.sin_port = htons(myport);
if (argv[3])
my_addr.sin_addr.s_addr = inet_addr(argv[3]);
else
my_addr.sin_addr.s_addr = INADDR_ANY;
if (bind
(listener, (struct sockaddr *) &my_addr, sizeof(struct sockaddr))
== -1) {
perror("bind");
exit(1);
} else
printf("IP 地址和端口绑定成功\n");
if (listen(listener, lisnum) == -1) {
perror("listen");
exit(1);
} else
printf("开启服务成功!\n");
/* 创建 epoll 句柄,把监听 socket 加入到 epoll 集合里 */
kdpfd = epoll_create(MAXEPOLLSIZE);
len = sizeof(struct sockaddr_in);
ev.events = EPOLLIN | EPOLLET;
ev.data.fd = listener;
if (epoll_ctl(kdpfd, EPOLL_CTL_ADD, listener, &ev) < 0) {
fprintf(stderr, "epoll set insertion error: fd=%d\n", listener);
return -1;
} else
printf("监听 socket 加入 epoll 成功!\n");
curfds = 1;
while (1) {
/* 等待有事件发生 */
nfds = epoll_wait(kdpfd, events, curfds, -1);
if (nfds == -1) {
perror("epoll_wait");
break;
}
/* 处理所有事件 */
for (n = 0; n < nfds; ++n) {
if (events[n].data.fd == listener) {
new_fd = accept(listener, (struct sockaddr *) &their_addr,
&len);
if (new_fd < 0) {
perror("accept");
continue;
我的问题是epoll本来是用来处理N多连接的方法,而在此中调用listen(listener, lisnum)
函数,而通常第二个参数的值都很小,比如5, 10 ,20,等等,还有人说listen函数根本不用
参数,可不用根本无法编译。我想知道当listen参数很小时对处理大量连接是否会有影响,
因为linux默认为128。 |
|