我正在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
是在中定义的线程局部全局变量<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);
}
}
另外,glibcprintf
和朋友支持%m
格式说明符,该说明符被替换为strerror(errno)
(不需要参数)。因此,以上示例可以替换为:
if (s < 0) {
fprintf(stderr, "socket() failed: %m\n");
exit(1);
}
为了使一切变得更简单,有一个perror
功能,可以打印出与上面类似的消息。
if (s < 0) {
perror("socket");
exit(1);
}
总结一切-错误处理不必太复杂和冗长。将socket调用和test< 0
放在一个语句中,上面的代码可能看起来像这样,您将成为真正的UNIX专业人士:
#include <stdio.h>
#include <errno.h>
int main(void) {
int s;
if ((s = socket(...)) < 0) {
perror("socket");
exit(1);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句