读取套接字缓冲区

时间:2012-10-04 06:08:15

标签: sockets tcp ftp client buffer

我正在尝试编写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(缓冲区)

吗?

2 个答案:

答案 0 :(得分:1)

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

如果套接字被设置为非阻塞,那么你将得到零返回“读取”,但即使你没有达到你的响应结束,你也可以得到它,因为你的程序肯定会比网络

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

答案 1 :(得分:0)

一个解决方案可能是每次read进入buffer时,请在读取缓冲区包含状态结束之后进行检查,如果不是,则再次检查{{1} } else read;

异步I / O的其他解决方案是使用breakselect函数。 检查输入是否在指定时间内可用。有关详细信息,请查看手册页。