1
這段代碼(C-Linux)有什麼問題?用套接字發送文件
我想從服務器接收文件,只要我有一個字節,我立即發送這個字節。但它不起作用。這一點很重要。
int Recv_File(int server,int client,char *buffer_ricezione,size_t dimensione_file){
ssize_t nwritten,nread;
size_t n;
char c;
for (n=1; n<dimensione_file; n++) {
nread = recv(server,&c,1,0);
if (nread == 1) {
nwritten = send(client,&c,1,0);
}else{
return -1; // chiudo connessione con il client
}
}
return 1;
}
感謝
你應該緩衝區大小,所以用幾千字節的緩衝區調用'recv',你應該使用'poll'這樣的多路複用系統調用。閱讀http://advancedlinuxprogramming.com/ –
你的意思是它沒有立即傳輸? TCP有自己的算法來決定如何將字節放在數據包中。如果是這種情況,你需要看看你的tcp選項。 – Duck
關閉Nagle的算法(通過setsockopt(fd,IPPROTO_TCP,TCP_NODELAY))可以避免200mS的發送延遲,但是如果程序一次只發送一個字節,它會表現得很差,因爲每個字節都會自動分開網絡數據包。所以如果你關閉Nagle的話,一定要修改函數來發送每個send()調用多個字節! (理想的每呼叫大小將等於或略小於網絡的MTU大小;即以太網的1384字節) –