网络编程文件描述符超过限制的解决办法

一句话总结:采用一个空闲的文件描述符来解决


accept函数


头文件:

<sys/types.h>

<sys/socket.h>

函数形式

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);

返回值

成功:返回新的套接字文件描述符

失败:返回-1,记录错误信息errno

EAGAIN:套接字处于非阻塞状态,当前没有连接请求。

EBADF:非法的文件描述符。

ECONNABORTED:连接中断。

EINTR:系统调用被信号中断。

EINVAL:套接字没有处于监听状态,或非法的addrlen参数。

EMFILE:达到进程打开文件描述符限制。

ENFILE:达到打开文件数限制。

ENOTSOCK:文件描述符为文件的文件描述符。

EOPNOTSUPP:套接字类型不是SOCK_STREAM。


int connfd = accept4(listenfd, (struct sockaddr*)&sockaddr, &socklen, SOCK_NONBLOCK | SOCK_CLOEXEC);

if (connfd == -1)

{

if (errno == EMFILE)

{

close(idlefd);

idlefd = accept(listenfd, NULL, NULL);

close(idlefd);

idlefd = open("/dev/null", O_RDONLY | O_CLOEXEC);

continue;

}

else

ERR_EXIT("accept4");

}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值