其中是来自socket.h的:: accept的错误号

时间:2012-09-03 09:20:12

标签: c++ linux sockets error-handling throw

这是我到目前为止所拥有的

socklen_t cli_size;
struct sockaddr cli;
int in_sock;

/* event from TCP server socket, new connection */
cli_size = sizeof(cli);
try {
    if ((in_sock  = ::accept(handle,&cli, &cli_size)) < 0) {
        throw in_sock;
        return NULL;
        }
    }
catch(int ex) {
    cout << "Exception Nr. " << ex << endl;
    }

来自手册页:

  

出错时,返回-1,并正确设置errno。

问题:我还是无法理解errno在哪里?我需要了解异常

1 个答案:

答案 0 :(得分:4)

errno是一个全局整数变量,在accept等系统调用失败后包含错误代码。您可能必须为要定义的变量包含头文件<errno.h>

在您的情况下,您不应该抛出accept返回的值,而是errno的值:

try
{
    if ((in_sock = accept(...)) == -1)
        throw errno;
    // ...
}
catch (int error)
{
    std::cout << "Error code " << error << " (" << std::strerror(error) << ")\n";
}

函数std::strerror在头文件<cstring>中声明,并返回描述错误的字符串。

重要说明:errno的值仅在有效时才会返回失败的函数。如果在您的示例中accept成功,则errno的值未定义。