【问题标题】:How to stop reading from socket如何停止从套接字读取
【发布时间】:2013-02-13 15:38:10
【问题描述】:

我很迷茫。我不知道如何停止从服务器读取。我基本上是将目录中每个文件的列表从服务器发送到客户端。这就是我正在做的事情。

服务器端:

 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);       
}   

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

【问题讨论】:

  • 你为什么要发送所有的 NUL 字节(和垃圾)?

标签: c sockets


【解决方案1】:

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

从表面上看,第二更容易,第一可能更可靠和高效。恭喜,您现在已经构建了您的第一个通信协议。

【讨论】:

  • 因此,如果在我的服务器端内容结束时,我只写 n = write(newsock, "-1", MAX );而在客户端,只需执行 while(strcmp( buf, "-1" ) != 0 ) 之类的 while 循环 ...可以接受吗?似乎它可以工作,除非当我运行其他命令时,服务器开始发送更多文件名,而它应该发送完全不同的东西。
  • 一个合理的方法可能是让客户端在读取文件结束信号“-1”后关闭套接字,然后让服务器和客户端为下一次数据交换建立一个新的套接字.我的猜测是您在修改后的代码中存在一些逻辑错误,导致您在此处描述的行为。另外如前所述,您不想每次都写 MAX ,只需发送带有分隔符的实际数据(改进协议)。否则你会浪费电线上的空间。
  • 这可能会发生......祝你好运。这个协议思想非常强大且被广泛使用,毕竟您的套接字不知道您正在发送的数据,因此客户端和服务器必须对预期的内容有共同的理解。
【解决方案2】:

定义一个协议。

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

【讨论】:

    猜你喜欢
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    相关资源
    最近更新 更多