2012-10-04 121 views
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(缓冲)

回答

0

一种解决方案可能是,你readbuffer每次检查读取缓冲区包含结束状态与否后,如果没有的话再read其他break;

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

1

read是一个阻塞调用(除非您已将套接字设置为非阻塞),所以只有当它收到您请求的字节的确切数量或套接字被关闭后才会返回。

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

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