2013-10-23 48 views
0

我有在C.在while循環滯留在客戶端

問題的客戶端服務器編程的一個問題是代碼卡在客戶代碼while循環。該代碼是@客戶:

while ((n_read=((read(sockfd,&buffer,sizeof(buffer))))>0) 
{ 
    buffer[n_read]='\0';        
    write(fd,buffer,strlen(buffer)); 
    printf("------- the value of n_read is : %d\n",n_read) ; 
} 

所以,當我調試使用在客戶端上使用strace這個代碼在這裏是系統調用的快照。我看到從服務器讀取整個文件後n_read的值是1,但是讀取= 0後服務器正常退出讀取? 我怎樣才能解決這個問題

的客戶端代碼卡:

read(3, "._guardAgainstUnicode(pad)\n# Pad"..., 1025) = 1025 
write(4, ".", 1)      = 1 
write(1, "------- the value of n_read is :"..., 35------- the value of n_read is : 1 
) = 35 
read(3, "crypted\nwith the already specifi"..., 1025) = 1025 
write(4, "c", 1)      = 1 
write(1, "------- the value of n_read is :"..., 35------- the value of n_read is : 1 
) = 35 
read(3, " = bytes.fromhex('').join(result"..., 1025) = 1025 
write(4, " ", 1)      = 1 
write(1, "------- the value of n_read is :"..., 35------- the value of n_read is : 1 
) = 35 
+2

我認爲你在'while'聲明中錯過了關閉')'但是很難計數,因爲有那麼多。 – Bucket

+1

當服務器沒有關閉TCP連接時,會發生什麼。因此,請驗證服務器是否關閉連接。當連接關閉時,read()將返回<= 0,並且循環將結束。 – nos

+0

是的,你有6個'('和5''')的條件。 – ChiefTwoPencils

回答

2

代碼被寫入緩衝區之外。

如果讀取的字節數填充緩衝區,則n_read將等於sizeof(buffer)。然後buffer[n_read]='\0'將寫入過去結尾buffer

while ((n_read=((read(sockfd,&buffer,sizeof(buffer))))>0) 
{ 
    buffer[n_read]='\0'; 

改用n_read確定write()長度。

ssize_t n_read; 
char buffer[1024]; 
while ((n_read = read(sockfd, buffer, sizeof buffer)) > 0) {  
    // buffer[n_read]='\0';        
    // write(fd,buffer,strlen(buffer)); 
    write(fd, buffer, n_read); 
    printf("------- the value of n_read is : %zu\n", (size_t) n_read) ; 
} 

[編輯] OP說: 「同樣的問題,它堅持」

沒有看到服務器代碼我提供的答案是...

服務器端不發送任何形式的「文件結束」。服務器簡單地停止發送數據。接收端不會「知道」沒有更多數據,只是「知道」當時沒有更多數據可用,耐心等待。

(按優先順序排列)

1)確保服務器確實做close(),這應該原因read()最終返回< 0(見@nos評論)。

2)服務器只有當它是最後一個時發送一個特殊字符。 ASCII碼26(^ Z)和255(截斷典型EOF)是典型的候選。然後當收到這樣的信息時,它停止。

3)形成數據包。服務器預先發送一個長度的數據。客戶端使用此長度。負值可用於指示錯誤或EOF。

+0

mmmmmmmmm同樣的問題,它卡住了? – zak

+1

@ user2103930服務器端怎麼樣?您是否確認服務器關閉了連接,例如我要求您檢查註釋?關閉連接的服務器是while循環結束的唯一方法。 – nos

+0

thanx我試圖關閉服務器的工作,但如果我想不關閉服務器和客戶端套接字,什麼是解決方案? – zak