0

我正在尝试编写一个 FTP 客户端,我需要打印出服务器对我的命令的响应。这些命令之一是 STAT。服务器返回响应,据我了解,响应位于套接字缓冲区中,我可以使用 read() 命令读取该缓冲区。问题是我只需要 STAT 的响应,所以我知道它将以 END OF STATUS 结束。这是我为阅读响应而编写的代码:

in = read(connFd, &timebuffer, sizeof(timebuffer));;
while(in>0){
    printf("%s", timebuffer);
    memset(&timebuffer, 0, sizeof timebuffer);
    in = read(connFd, &timebuffer, sizeof(timebuffer));
}
memset(&timebuffer, 0, sizeof timebuffer);

我遇到的问题是,一旦 read() 函数通过缓冲区并完成读取,while 循环不会终止并无限继续,我的程序就坐在那里。我认为这是因为 read() 函数正在等待数据,所以我想知道是否有办法告诉 read() 在到达缓冲区末尾时停止。我认为这会自动发生,因为 read() 会返回 x<1 但如果它正在等待我明白问题是什么。那么我该如何解决呢?有没有办法设置超时(0),所以它只会读取已经存在的数据?我也知道有一些“标志”设置为 0,但我找不到太多关于它们的信息。我很感激任何帮助。唯一的方法是检查缓冲区中的“END OF STATUS”字符串吗?我会使用 strstr(buffer)

4

1 回答 1

1

read是一个阻塞调用(除非您已将套接字设置为非阻塞),因此只有在收到您请求的确切字节数或套接字关闭时才会返回。

如果套接字设置为非阻塞,那么您将获得“读取”的零返回,但即使您还没有到达响应的末尾,您也可能会得到它,因为您的程序肯定会比网络快。

strstr()作为附加说明...除非您连接所有读取,否则您不能使用。您可以在一次读取中获得 1/2 的终止消息,而在下一次读取中获得剩余消息。

于 2012-10-04T13:22:37.743 回答