【问题标题】:Getting error code when creating a socket in Linux在 Linux 中创建套接字时出现错误代码
【发布时间】:2014-11-24 02:23:28
【问题描述】:

我正在 Linux 中进行一些套接字编程,并且想知道如何在函数 socket(...); 时获取错误代码。失败。

例如对于“getaddrinfo”功能,我可以这样做:

//Resolve the server address and port
    result = (struct addrinfo *) calloc(1, sizeof(struct addrinfo));
    iResult = getaddrinfo("google.com", DEFAULT_PORT, &hints, &result);
    if (iResult != 0){
        printf("%d\n", iResult);
        fprintf(stderr, "getaddrinfo failed: %s\n", gai_strerror(iResult));
        getchar();
        exit(EXIT_FAILURE);
    }

但是我想使用 socket(...) 函数做类似的事情。

据此: http://linux.die.net/man/2/socket

该函数在失败时返回 -1,并将 errno 设置为适当的错误号。我如何访问这个“errno”? 到目前为止,这是我的代码:

int connectSocket = 0;
connectSocket = socket(AF_INET, SOCK_STREAM, 0);
printf("%d\n", connectSocket);

if (connectSocket == -1){
    printf("socket failed with error: %s\n", error_string); //TODO: HELP DECLARING error_string
    getchar();
    exit(EXIT_FAILURE);
}

【问题讨论】:

  • 参见 errno(3)strerror(3) 手册页。
  • 不要为您在getaddrinfo() 的最后一个参数中传递的addrinfo 分配内存。它将为您分配addrinfo,您将其传递给freeaddrinfo() 以释放它:result = NULL; iResult = getaddrinfo(..., &result); if (iResult == 0) { ...; freeaddrinfo(result); }

标签: c linux sockets


【解决方案1】:

errno 是线程局部全局变量,在<errno.h> 中定义。许多库函数的手册页会指出它们在出错时返回 -1,并设置为errno

您可以使用strerror 函数将errno 值转换为有用的字符串。

一般来说,你应该这样编码:

#include <stdio.h>
#include <errno.h>

int main(void) {
    int s;

    s = socket(...);
    if (s < 0) {
        fprintf(stderr, "socket() failed: %s\n", strerror(errno));
        exit(1);
    }
}

或者,glibc 的printf 和朋友支持%m 格式说明符,它被替换为strerror(errno)(不需要参数)。所以上面的例子可以替换为:

    if (s < 0) {
        fprintf(stderr, "socket() failed: %m\n");
        exit(1);
    }

为了简单起见,还有perror 函数,它会打印出类似于上面的消息。

    if (s < 0) {
        perror("socket");
        exit(1);
    }

总结一下 - 错误处理不需要复杂和冗长。将套接字调用和&lt; 0 的测试放在一个语句中,上面的代码可能如下所示,您将成为真正的 UNIX 专家:

#include <stdio.h>
#include <errno.h>

int main(void) {
    int s;

    if ((s = socket(...)) < 0) {
        perror("socket");
        exit(1);
    }
}

【讨论】:

  • 奇怪的是:“fprintf(stderr, "socket() failed: %s\n", strerror(errno));"似乎没有工作!相反,它只会退出程序。但其余的都做了!非常感谢!
  • nit: #define errno (*__get_errno()) 是合法的,它不一定是变量,它是一个“扩展为具有int 类型和线程本地存储的可修改左值”的宏。
【解决方案2】:

添加#include &lt;errno.h&gt;,您将能够读取全局errno 变量。

connectSocket = socket(AF_INET, SOCK_STREAM, 0);
if (connectSocket < 0) {
    if (errno == EACCESS) ...

您可以使用stdio.h 中的perror 根据errno 的值打印错误消息,也可以使用string.h 中的strerror 访问描述错误代码的字符串

connectSocket = socket(AF_INET, SOCK_STREAM, 0);
if (connectSocket < 0) {
    perror("socket");
    exit(EXIT_FAILURE);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-15
    • 2014-05-25
    • 2015-06-19
    • 1970-01-01
    • 2023-01-24
    • 1970-01-01
    • 2011-11-06
    • 1970-01-01
    相关资源
    最近更新 更多