2014-03-24 193 views
-1

我正在写一个TCP服务器/客户端程序,并希望将文件从服务器发送到客户端。这是我的代码,无法发送文件。我使用recv()send()发送文件。提前致谢。TCP客户端/服务器发送/接收文件

客户端:

char *location = "/home/kostas/Downloads/download.txt"; 
FILE *download = fopen(location, "w+"); 
if(download == NULL) 
{ 
    printf("Error\n"); 
    fflush(stdout); 
} 
int transfer = 0; 
memset(buffer, 0, 1024); 
while((transfer = recv(connFd, buffer, 1024 , 0) > 0)) 
{ 
    int write = fwrite(buffer, sizeof(char), transfer, download); 
    memset(buffer, 0, 1024); 
    if((transfer == 0) || (transfer != 1024)) 
    { 
     break; 
    } 
} 
memset(buffer, 0, 1024); 
if(read(connFd, buffer, sizeof(buffer)) < 0) 
{ 
    printf("Read error\n"); 
    fflush(stdout); 
} 

服务器端:

//i get the filename by read/write 
FILE *file = fopen(fileName, "r"); 
memset(buffer, 0, 1024); 
int i = 0; 
while((i = fread(buffer, sizeof(char), 1024, file)) < 0) 
{ 
    if(send(connFd, buffer, i, 0) < 0) 
    { 
     printf("Error\n"); 
     fflush(stdout); 
    } 
    memset(buffer, 0, 1024); 
} 

我不知道我做错了吗?之后,我打算使用posix线程来实现文件传输。

+0

再次检查接收'while'循环,你放错了一些括号。实际上,你在服务器的读取循环中遇到同样的问题。您可能需要检查[此运算符优先级表](http://en.cppreference。COM/W/C /语言/ operator_precedence)。 –

+0

donte告诉我i = fread ... <0.让我检查一下,但我认为这是我的错误。 – KostasRim

+0

我确实改变了它,但它仍然不起作用:/ – KostasRim

回答

1
while((transfer = recv(connFd, buffer, 1024 , 0) > 0)) { 
    int write = fwrite(buffer, sizeof(char), transfer, download); 

你很高兴在这里。

memset(buffer, 0, 1024); 

毫无意义。去掉。

if((transfer == 0) || (transfer != 1024)) 
{ 
    break; 
} 

transfer(一)不能为零,在这一点上,和(b)可以是1和1024之间在这里什么。没有理由停止,如果它不是1024.删除这个块。

memset(buffer, 0, 1024); 

毫无意义。去掉。

if(read(connFd, buffer, sizeof(buffer)) < 0) 
{ 
    printf("Read error\n"); 
    fflush(stdout); 
} 

您需要的read()结果存储在一个变量,以及:

  • 测试为-1,这表明读取错误,你应该打印,通过perror()strerror()
  • 测试它为零,这表明流结束
  • 否则将它用作以下代码中的读取计数,就像上面一样。

但我不知道你为什么在这里读什么。输入已耗尽或发生读取错误。去掉它。

memset(buffer, 0, 1024); 

毫无意义。去掉。

int i = 0; 

初始化毫无意义。去掉。

while((i = fread(buffer, sizeof(char), 1024, file)) < 0) 
{ 
    if(send(connFd, buffer, i, 0) < 0) 
    { 
     printf("Error\n"); 

在这一点上,您还是应该打印错误,如上所述。只是打印'错误'是没用的。发生时,您会立即想知道它是什么,您将不得不返回并修改代码以找出答案。

memset(buffer, 0, 1024); 

毫无意义。去掉。

+1

3年后!这是我第一次参加网络课程(我是在我的第二年)。我记得我已经修复了错误,因为我在该练习中取得了很好的成绩!谢谢你的回答! – KostasRim

相关问题