如何停止从套接字读取

时间:2013-02-27 17:44:26

标签: c sockets

我很迷茫。我无法弄清楚如何停止从服务器读取。我基本上是从目录服务器向客户端发送目录中每个文件的列表。这是我正在做的事情。

服务器端:

 struct dirent *ep = readdir(dp);      
    while( ep ){  
        sprintf(buf, "%s", (ep->d_name));
        n = write(newsock, buf, MAX );           
        ep = readdir(dp);  
    }

客户端:

while( n = read(sock, buf, MAX)){
    printf("buf: %s\n" , buf);       
}   

所以服务器端的东西工作正常。我可以看到我正在发送所有文件名,但在客户端它会读取所有名称,但只是等待阅读更多。

2 个答案:

答案 0 :(得分:3)

您需要从服务器发送一些“EOF”指示符,以便客户端知道打破循环,或让服务器关闭套接字(在允许客户端读取所有数据的“一段时间”之后)。这将导致读取以错误条件退出。

从表面上讲,第二种方法更容易,首先可能更加可靠和高效。恭喜,您现在已经构建了第一个通信协议。

答案 1 :(得分:1)

定义协议。

一个非常简单的方法可能是让服务器向客户端发送一个空的(0长度)文件名,告诉客户端它已完成发送。要成功执行此操作,您可能希望通过例如addtionaly \r\n序列或类似名称来分隔每个文件名。