【问题标题】:where is error number of ::accept from socket.h来自 socket.h 的 ::accept 的错误号在哪里
【发布时间】:2012-09-03 09:20:11
【问题描述】:

这是我目前所拥有的

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在哪里?我需要了解异常

【问题讨论】:

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


    【解决方案1】:

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

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

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

    函数std::strerror在头文件&lt;cstring&gt;中声明,并返回一个描述错误的字符串。

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

    【讨论】:

    • 谢谢,5分钟后批准。结果:错误代码 24(打开的文件太多)...哇,这是我无法理解的东西 :) 套接字...文件...
    • @МарияШарапова 请记住,在 Unix 系统(如 Linux)中,套接字只是另一个文件描述符,它使用与普通文件相同的表。此错误意味着您有很多(超过 1000 个)连接和/或文件打开,这可能表明您在使用后没有关闭连接和/或文件正确。
    猜你喜欢
    • 2010-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多