2013-02-27 75 views
1

我很迷茫。我無法弄清楚如何停止從服務器讀取。我基本上是從服務器發送目錄中的每個文件列表到客戶端。繼承人我在做什麼。如何停止從插座讀取

服務器端:

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

所以服務器端的東西正常工作。我可以看到我發送的所有文件名都是正確的,但在客戶端它讀取所有名稱,但只是等待閱讀更多。

+1

你爲什麼要發送所有的NUL字節(和垃圾)? – wildplasser 2013-02-27 17:47:35

回答

2

您可能需要從服務器發送一些「EOF」指示符,以便客戶端知道打破循環,或者讓服務器關閉套接字(在允許客戶端讀取所有數據之後「關閉」一段時間後)。這將導致讀取以錯誤狀態退出。

其次更容易面對它,首先可能會更可靠和高效。恭喜,您現在已經構建了您的第一個通信協議。

+0

所以如果在我的服務器端的東西,如果我只是寫像n =寫(newsock,「-1」,MAX);並在客戶端只是做while循環while(strcmp(buf,「-1」)!= 0)...是可以接受的嗎?似乎它工作,除非我運行其他命令時,服務器開始發送更多的文件名時,它應該發送完全不同的東西。 – 2013-02-27 17:59:00

+0

合理的做法可能是讓客戶端在讀取文件列表信號「-1」結束後關閉套接字,然後讓服務器和客戶端爲下一次數據交換建立一個新套接字。我的猜測是你在修改後的代碼中有一些邏輯錯誤,導致你在這裏描述的行爲。同樣如上所述,您不希望每次都寫MAX,只需使用分隔符(改進協議)發送實際數據。否則,你正在浪費線路上的空間。 – 2013-02-27 18:15:47

+0

天哪沒關係。顯然睡眠不足是我最大的敵人。 – 2013-02-27 18:18:43

1

定義一個協議。

一個非常簡單的可能是讓服務器向客戶端發送一個空的(0長度)文件名,告訴客戶端它已完成發送。要成功完成此操作,您可能希望通過例如添加\r\n序列或類似方法來劃分每個文件名。