2013-06-26 138 views
-2

我有一個服務器(調用servera)接收從另一個服務器端文件發送到客戶端的問題。問題是,客戶端文件大小接收0,因此零個字節的文件:發送文件套接字C linux

/* receive file size from serverB */ 

recv(s,&bytes,sizeof(bytes),0); 

/* send file size to client */ 

send(file_descriptor,&bytes,sizeof(bytes),0); 

bytes = ntohs(bytes); 

/* receive (from serverb) and send immediately (to client)*/ 

while (total != bytes) { 
    nread = read(s,&c,sizeof(char)); 
    if(nread == 1){ 
     send(file_descriptor,&c,sizeof(c),0); 
     total += nread; 
    } 
} 

有什麼不對?

+0

爲了幫助診斷問題,我建議讓Wireshark和看流量。 –

+1

檢查'recv'的結果。它可能比你想要的要少(或者對錯誤負面)。另外,瞭解如'poll'的多路複用系統調用。閱讀http://advancedlinuxprogramming.com/ –

+0

如何在接收緩衝區中有一個字節的情況下,儘快利用poll進行接收和發送? – user2510406

回答

1

一切都可能是錯誤的。

必須在依賴副作用之前檢查I/O調用錯誤,否則您將得到不可預知的結果。

在你的情況,也許是第一個recv()出現故障,剩下bytes初始化爲0

此外,循環每次讀一個字節是非常效率低,而且仍然未能確認它管理髮送該字節(send()可能會失敗,在這種情況下,您需要重新嘗試)。