2013-06-26 140 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()可能会失败,在这种情况下,您需要重新尝试)。