我正在尝试编写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(缓冲区)
吗?答案 0 :(得分:1)
read
是一个阻塞调用(除非你将套接字设置为非阻塞),因此只有在收到你请求的确切字节数或套接字被关闭后才返回。 / p>
如果套接字被设置为非阻塞,那么你将得到零返回“读取”,但即使你没有达到你的响应结束,你也可以得到它,因为你的程序肯定会比网络
作为补充说明......除非连接所有读数,否则不能使用strstr()
。您可以在一次读取中获得1/2的终止消息,并在下一次读取时获得剩余的消息。
答案 1 :(得分:0)
一个解决方案可能是每次read
进入buffer
时,请在读取缓冲区包含状态结束之后进行检查,如果不是,则再次检查{{1} } else read
;
异步I / O的其他解决方案是使用break
和select
函数。
检查输入是否在指定时间内可用。有关详细信息,请查看手册页。