Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
C 套接字描述符无效,连接保持打开状态_C_Sockets - Fatal编程技术网

C 套接字描述符无效,连接保持打开状态

C 套接字描述符无效,连接保持打开状态,c,sockets,C,Sockets,我有两个程序:一个只是包装有问题的库的客户端和一个echo服务器。客户机连接到echo服务器,发送X字节,echo服务器将它们回送回来 当客户端尝试从套接字文件描述符读取时,会出现错误的文件描述符错误EBADF 出于调试目的,在使用perror在控制台上抛出错误之前,我尝试让客户端尝试编写另一个问题的答案中建议的代码,但问题仍然存在 TL;DR:套接字描述符没有被修改,客户端最初可以写入套接字,但同一描述符稍后将变为无效。为什么? 当前代码是可用的库,第106行,可使用库执行,echo服务器,仅

我有两个程序:一个只是包装有问题的库的客户端和一个echo服务器。客户机连接到echo服务器,发送X字节,echo服务器将它们回送回来

当客户端尝试从套接字文件描述符读取时,会出现错误的文件描述符错误EBADF

出于调试目的,在使用perror在控制台上抛出错误之前,我尝试让客户端尝试编写另一个问题的答案中建议的代码,但问题仍然存在

TL;DR:套接字描述符没有被修改,客户端最初可以写入套接字,但同一描述符稍后将变为无效。为什么?


当前代码是可用的库,第106行,可使用库执行,echo服务器,仅从internet复制粘贴-我会在提供答案后立即将代码的有用部分添加到问题中。

正如@Mat所评论的,我没有正确检查read是否返回错误: 而不是

while (r < 4 && errno == 0)
{
    r += read(client->client_socket, buffer_length, 4 - r);
}
因为,正如他所说,即使阅读成功,它也能改变错误。它应该是:

while (r < 4 && errno == 0)
{
    int h = read(client->client_socket, buffer_length, 4 - r);
    if (h == -1) { r = -1; break; }
    r += h;
}
int h;
r = 0;
while (r < 4 && (h = read(client->client_socket, buffer+r, 4 - r)) > 0)
{
    r += h;
}
if (h == -1)
    ...

请注意,将“errno”与零进行比较是不正确的。

您的错误处理无效。事情可以将errno设置为非零且不会失败。只有当函数返回错误时,您才应该检查errno,因为您的代码没有正确执行该操作。这实际上解决了问题。我在接下来的几次阅读中检查了这类问题,但完全忘记了在第一次阅读中添加检查。谢谢,还是错的。除非函数返回一个错误,否则永远不应该检查errno。只有当read返回-1时,rIt才会检查错误。errno检查紧跟在while循环之后。不,此行仍然错误:whiler<4&&errno==0。当r为0、1、2或3时,不应检查errno==0。如果r
int h;
r = 0;
while (r < 4 && (h = read(client->client_socket, buffer+r, 4 - r)) > 0)
{
    r += h;
}
if (h == -1)
    ...