【问题标题】:TCP client/server send/receive filesTCP 客户端/服务器发送/接收文件
【发布时间】:2023-04-03 15:03:01
【问题描述】:

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

客户端:

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线程来实现文件传输。

【问题讨论】:

  • 再次检查接收while循环,你放错了一些括号。实际上,服务器中的读取循环也有同样的问题。您可能想检查例如this operator precedence table.
  • 不要告诉我 i = fread...
  • 我确实改了,但还是不行:/
  • 那么,客户端连接成功了吗?服务器 accept() 是否返回?您是否进行过任何调试?
  • 是的,客户端连接成功并且接受返回。是的,我做了调试。我还更正了 while 循环中的括号。但仍然...

标签: c tcp client-server


【解决方案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 (a) 此时不能为零,(b) 可以是 1 到 1024 之间的任何值。如果不是 1024 就没有理由停止。删除这个块。

memset( buffer, 0, 1024 );

毫无意义。删除。

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

您需要将read() 结果存储在一个变量中,并且:

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

但我不知道你为什么在这一点上阅读任何东西。输入已用尽或已发生读取错误。删除它。

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 );

毫无意义。删除。

【讨论】:

  • 3 年后!!这是我在网络课上的第一次练习!(我在 CS 的第二年)。我记得我已经改正了错误,因为我在那次练习中获得了好成绩!感谢您的回答!
猜你喜欢
  • 1970-01-01
  • 2017-07-10
  • 2021-12-04
  • 2016-09-03
  • 1970-01-01
  • 2012-04-28
  • 2013-10-02
  • 1970-01-01
  • 2020-11-21
相关资源
最近更新 更多