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

时间:2014-04-26 13:27:46

标签: c sockets

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

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

出于调试目的,在使用perror()在控制台上抛出错误之前,我试图让客户端在另一个问题的答案中尝试write(),但问题确实存在。

TL; DR:套接字描述符未被修改,客户端最初可以写入()到套接字,但后来同一个描述符变为无效。为什么?

当前代码可用here(库,第106行),here(使用库可执行)和here(echo服务器,仅从互联网上复制) - I一旦提供了答案,就会将问题的有用部分添加到问题中。

2 个答案:

答案 0 :(得分:0)

应该是:

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

请注意,将'errno'与零进行比较永远不会正确。

答案 1 :(得分:-1)

正如@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;
}

然后在检查错误时:

if (r == -1)
{
    switch(errno)
    {
        case EBADF:
            //...
            break;
     }
}

因为正如他所说,read()即使成功也会改变错误。