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