TCP操作超时

时间:2009-09-26 02:32:08

标签: c unix networking tcp

我有一个用C语言编写的TCP服务器和客户端,它打开了一个应该永远打开的连接。在第一次发送时,errno返回0,这很好。在后续发送时,它给出了一个错误60,即操作超时。服务器仍然收到数据包,但似乎没有任何错误。什么可能导致errno被设置?是否最好忽略此错误,因为它似乎正常工作?

3 个答案:

答案 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变量不会保留有意义的值。