在Linux中创建套接字时获取错误代码

Yah*_*din 4 c sockets linux

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

例如,对于"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);
    }
Run Code Online (Sandbox Code Playgroud)

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

根据这个:http: //linux.die.net/man/2/socket

函数在失败时返回-1,并将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);
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*art 11

errno是一个线程局部全局变量,定义于<errno.h>.许多库函数的手册页将指示它们在出错时返回-1并进行设置errno.

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

通常,您应该像这样编码:

#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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

为了使它更简单,有一个perror函数,它打印出类似于上面的消息.

    if (s < 0) {
        perror("socket");
        exit(1);
    }
Run Code Online (Sandbox Code Playgroud)

把它全部包装好 - 错误处理不需要复杂和冗长.将套接字调用和测试< 0放在一个语句中,上面的代码看起来像这样,你将是一个真正的UNIX专家:

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

int main(void) {
    int s;

    if ((s = socket(...)) < 0) {
        perror("socket");
        exit(1);
    }
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*sen 5

添加#include <errno.h>后您将能够读取全局errno变量。

connectSocket = socket(AF_INET, SOCK_STREAM, 0);
if (connectSocket < 0) {
    if (errno == EACCESS) ...
Run Code Online (Sandbox Code Playgroud)

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

connectSocket = socket(AF_INET, SOCK_STREAM, 0);
if (connectSocket < 0) {
    perror("socket");
    exit(EXIT_FAILURE);
}
Run Code Online (Sandbox Code Playgroud)