Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 在Linux中创建套接字时获取错误代码_C_Linux_Sockets - Fatal编程技术网

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

C 在Linux中创建套接字时获取错误代码,c,linux,sockets,C,Linux,Sockets,我正在Linux中做一些套接字编程,我想知道当函数socket(…)出现错误时如何获取错误代码;失败了 例如,对于“getaddrinfo”函数,我可以执行以下操作: //Resolve the server address and port result = (struct addrinfo *) calloc(1, sizeof(struct addrinfo)); iResult = getaddrinfo("google.com", DEFAULT_PORT, &

我正在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(…)函数做类似的事情

据此:

函数在失败时返回-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
是线程局部全局变量,在中定义。许多库函数的手册页将指示它们在出错时返回-1,并设置
errno

您可以使用函数将
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);
    }
}
为了让一切变得更简单,还有一个函数,它打印出一条与上面类似的消息

    if (s < 0) {
        perror("socket");
        exit(1);
    }
if(s<0){
佩罗(“插座”);
出口(1);
}
总而言之,错误处理不需要复杂和冗长。将套接字调用和对
<0
的测试放在一条语句中,上面的代码可能如下所示,您将成为一名真正的UNIX专业人员:

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

int main(void) {
    int s;

    if ((s = socket(...)) < 0) {
        perror("socket");
        exit(1);
    }
}
#包括
#包括
内部主(空){
int-s;
如果((s=socket(…)<0){
佩罗(“插座”);
出口(1);
}
}
Add
#include
,您将能够读取全局
errno
变量

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

请参阅
errno(3)
strerror(3)
手册页。不要为
getaddrinfo()
的最后一个参数中传递的
addrinfo
分配内存。它将为您分配
addrinfo
,您将其传递给
freeaddrinfo()
以释放它:
result=NULL;iResult=getaddrinfo(…,&result);如果(iResult==0){…;freeaddrinfo(result);}
很奇怪:“fprintf(stderr,“socket()失败:%s\n”,strerror(errno));”似乎不起作用!相反,它只会退出程序。但其他人都做到了!非常感谢!nit:
#define errno(*uu get_errno())
是合法的,它不一定是一个变量,它是一个“宏”,它扩展为一个可修改的左值,具有类型
int
和线程本地存储”。
connectSocket = socket(AF_INET, SOCK_STREAM, 0);
if (connectSocket < 0) {
    if (errno == EACCESS) ...
connectSocket = socket(AF_INET, SOCK_STREAM, 0);
if (connectSocket < 0) {
    perror("socket");
    exit(EXIT_FAILURE);
}