我有一个用C语言编写的TCP服务器和客户端,它打开了一个应该永远打开的连接。在第一次发送时,errno返回0,这很好。在后续发送时,它给出了一个错误60,即操作超时。服务器仍然收到数据包,但似乎没有任何错误。什么可能导致errno被设置?是否最好忽略此错误,因为它似乎正常工作?
答案 0 :(得分:3)
随机猜测:errno
仅在函数失败时设置。如果函数没有失败,errno
保持原样。 不设置为0.以下是错误的:
send( … );
if (errno) {
perror("send");
}
相反,您必须检查发送结果:
ssize_t res = send( … );
if (-1 == res) {
perror("send")
}
您可以使用以下程序进行确认:
#include <stdio.h>
#include <unistd.h>
int main() {
char buf[16];
ssize_t res;
read(999, buf, sizeof(buf));
perror("read");
write(1, "hello world\n", 12);
perror("write");
}
输出:
read: Bad file descriptor
hello world
write: Bad file descriptor
(注意:假设STDOUT为fd 1)
答案 1 :(得分:2)
正如其他人所提到的,你需要测试Unix系统函数的返回值......所有这些函数!...以便以防弹的方式解释errno
值。我将您推荐给规范指南的第6项,Henry Spencer的The Ten Commandments for C programmers:
如果一个函数被广告以便在遇到困难时返回错误代码,那么你应该检查那个代码,是的,即使检查代码的大小增加了三倍并且在你的打字手指中产生疼痛,如果你是最薄的“这不可能发生在我身上”,众神肯定会因你的傲慢而惩罚你。
答案 2 :(得分:0)
我认为你只测试errno变量,但不测试send()的返回值。
在函数返回值指示errno变量由函数设置后,应检查errno变量。如果函数未报告已设置errno,则errno变量不会保留有意义的值。