微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

errno在Linux socket编程后接受

正如在RETURN VALUE部分的accept()手册页所述:

error handling

Linux accept() (和accept4() )将accept()的错误代码传递到新套接字上的已经挂起的networking错误。 这种行为不同于其他BSD套接字实现。 为了可靠的操作,应用程序应该在accept()之后检测为协议定义的networking错误,并通过重试将它们看作EAGAIN 。 在TCP / IP的情况下,这些是ENETDOWN , EnopROTOOPT , EHOSTDOWN , ENONET , ehostunreachehostunreach , EOPNOTSUPP和ENETUNREACH 。

这是否意味着必须在accept()返回之后并在检查accept()的返回值之前检查errno的值? 如果是的话,并且如果errno则必须采取哪些措施?

这里是我的代码处理accept()的一个片段:

IWebbrowser2.Document不返回IHTMLDocument2

什么是最快的方法/库来计算在C ++matrix的排名

高效地实时处理数据,并在C中推入数据库

我怎样才能安装curl在Windows上使用C

键盘越过UI不会改变UWP中的整个UI

newsockfd = accept(sockfd,(struct sockaddr *) &cli_addr,&clilen); if((errno == ENETDOWN || errno == EPROTO || errno == EnopROTOOPT || errno == EHOSTDOWN || errno == ENONET || errno == ehostunreach || errno == EOPNOTSUPP || errno == ENETUNREACH)) return; if (newsockfd < 0) { // error } else if(newsockfd > 0) { // accepted a new connection } else { // blah blah blah }

我得出结论,在这种情况下,人们可能会再试一次。 我的结论是正确的吗?

如何在Linux内核中select“sys”和“proc”文件

NotifyIcon点击事件不会触发

CScrollView只能滚动大部分区域

何时程序受内存带宽的限制?

在Linux上为C ++程序存储资源的位置

首先,你检查accept()返回值。 如果accept()返回值小于0 ,那么你应该检查errno 。 如果是ENETDOWN , ENETDOWN , EnopROTOOPT , EHOSTDOWN , ENONET , ehostunreach , EOPNOTSUPP或ENETUNREACH ,那么你可以再次调用accept() 。 否则,发生了一些不好的事情,你应该停止调用accept() (例如,你已经通过了accept()的accept()参数)。

这就是我对代码的理解。

这里是如何处理错误

while (running) { newsockfd = accept(sockfd,&clilen); if (newsockfd < 0) { // error perror ("accept"); if((errno == ENETDOWN || errno == EPROTO || errno == EnopROTOOPT || errno == EHOSTDOWN || errno == ENONET || errno == ehostunreach || errno == EOPNOTSUPP || errno == ENETUNREACH)) { continue; } exit (EXIT_FAILURE); } // accepted a new connection // blah blah blah }

根据SUSv4 :

成功完成后, accept()将返回接受套接字的非负文件描述符。 否则,返回-1 ,并errno来指示错误

这意味着如果accept()返回-1则只需检查errno 。

你的代码可能看起来更像这样:

ret = accept(fd,&addr,sizeof (addr)); if (ret == -1) { switch (errno) { case EAGAIN: case EWOULDBLOCK: /* do something */ break; case EBADF: /* do something different */ break; default: /* do something even more different */ } }

(如何处理每个错误条件将取决于您的应用程序。)

另外,在检查accept()的返回值之后立即检查errno是很重要的。 如果您首先调用其他函数(即使是简单的fprintf() ),您也有可能用另一个错误覆盖errno 。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐