Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.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
TCP操作超时_C_Unix_Networking_Tcp - Fatal编程技术网

TCP操作超时

TCP操作超时,c,unix,networking,tcp,C,Unix,Networking,Tcp,我有一个用C编写的TCP服务器和客户端,它打开了一个应该永远打开的连接。在第一次发送时,errno返回0,这很好。在随后的发送中,它会给我一个errno 60,即操作超时。尽管如此,服务器仍然接收到数据包,似乎没有什么问题。什么会导致设置错误NO?既然这个错误看起来工作正常,那么最好忽略它吗 随机猜测:errno仅在函数失败时设置。如果函数没有失败,errno将保持原样。它未设置为0。以下是错误的: send( … ); if (errno) { perror("send"); } 相

我有一个用C编写的TCP服务器和客户端,它打开了一个应该永远打开的连接。在第一次发送时,errno返回0,这很好。在随后的发送中,它会给我一个errno 60,即操作超时。尽管如此,服务器仍然接收到数据包,似乎没有什么问题。什么会导致设置错误NO?既然这个错误看起来工作正常,那么最好忽略它吗

随机猜测: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");
}

注意:假设STDOUT是fd1,我想您只测试errno变量,而不是send的返回值


在函数返回值指示errno变量是由函数设置的之后,应该检查errno变量。如果函数未报告设置了errno,则errno变量不包含有意义的值。

正如其他人所提到的,您需要测试Unix系统函数的返回值…所有函数!。。。以防弹方式解释errno值。我建议您参考规范指南的第6项,亨利·斯宾塞的:


如果一个函数在遇到困难时被广告返回一个错误代码,你应该检查该代码,是的,即使检查的大小是你代码的三倍,并且在你的打字手指上产生疼痛,因为如果你认为这不会发生在我身上,上帝肯定会惩罚你的傲慢。

send真的返回-1吗?
read: Bad file descriptor
hello world
write: Bad file descriptor