gpt4 book ai didi

c - Linux套接字编程中接受后的errno

转载 作者:可可西里 更新时间:2023-11-01 11:49:03 27 4
gpt4 key购买 nike

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

Error handling
Linux accept() (and accept4()) passes already-pending network errors on the new socket as an error code from accept(). This behavior differs from other BSD socket implementations. For reliable operation the application should detect the network errors defined for the protocol after accept() and treat them like EAGAIN by retrying. In the case of TCP/IP, these are ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACH, EOPNOTSUPP, and ENETUNREACH.

这是否意味着必须在 accept() 返回之后和检查 accept() 的返回值之前立即检查 errno 的值> ?如果是,并且设置了 errno,必须采取哪些步骤?

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

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
}

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

最佳答案

首先,您检查accept() 返回值。如果accept()返回值小于0,那么你应该检查errno。如果是ENETDOWN, EPROTO, ENOPROTOOPT, EHOSTDOWN, ENONET, EHOSTUNREACHEOPNOTSUPPENETUNREACH,然后您可以再次调用accept()。否则会发生一些不好的事情,你应该停止调用 accept()(例如,你已经将错误的监听套接字作为 accept() 的参数传递)。

这就是我对代码的理解。

下面是错误处理的方法:

while (running) {
newsockfd = accept(sockfd, (struct sockaddr *) &cli_addr, &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
}

关于c - Linux套接字编程中接受后的errno,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28098563/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com