【问题标题】:udp client receiving a text fileudp 客户端接收文本文件
【发布时间】:2025-12-25 15:40:07
【问题描述】:

我正在尝试通过 UDP 套接字接收文本文件,客户端构建良好,但提供了一个空白控制台,经过一些实验,我发现问题出在接收上,所以我发布了我的那部分代码:

size_t data=0;
if(data=recvfrom( sd, file_buffer, sizeof(file_buffer), 0
                , (struct sockaddr *) &server, &server_length) < 0)
{
  printf("Error receiving file.");
  exit(1);
}

if(data==sizeof(file_buffer))
{
  printf("Received Data:[%s]",file_buffer);
}

【问题讨论】:

    标签: c


    【解决方案1】:

    如果忘记加括号()你应该重新写你

    if( data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0, (struct sockaddr *) &server, &server_length)

    原因:
    &lt; 的优先级高于 = 所以在你的 if() 中首先执行 &lt; 然后 = 这个原因在数据读取成功时分配data0,当recvfrom() 错误返回-1 时分配1
    看@C Operator Precedence Table

    你的代码被设备读成功了:

    if(data = 1 < 0)
    

    recvfrom() 上失败:

    if(data = -1 < 0) 
    

    错误?实际上你忘记了 () 括号(或者如果你不知道你应该添加。)比如:

    if( (data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0, (struct sockaddr *) &server, &server_length))

    看到我添加了()喜欢:

    if( (data = recvfrom() ) < 0) 
        ^                  ^  added in your code 
    

    编辑

    第二个错误:“缓冲区不是\0终止”

    函数recvfrom() 如果成功运行,则返回消息或数据报的长度(以字节为单位)。如果收到文件结束条件或关闭连接,则返回0

    需要注意的是它不会将'\0' 符号用于终止缓冲区。 而您正在使用'%s' 打印file_buffer[] 的内容,其中除了空终止字符串之外还会在运行时导致未定义的行为(如果没有出现分段错误,您可能会在控制台上看到不寻常的符号)。

    如果您想将文件缓冲区用作字符串,您应该始终阅读少于 sizeof(file_buffer) 之一并明确输入 null \0

    我可以建议你喜欢:

    no_Of_bytes =recvfrom( 
                    sd, 
                    file_buffer, 
                    sizeof(file_buffer) - 1, 
                    0,
                    (struct sockaddr *) &server, 
                    &server_length
                );
    file_buffer[no_Of_bytes] = '\0';
    

    现在您的file_buffer 是空终止的,您可以与%s 一起使用,但请确保您没有在代码的其他部分出错。

    【讨论】:

    • 好的,所以现在我在客户端接收数据,并且也能够将其写入文本文件,但我仍然有一个问题:尽管正在写入数据,但我得到了“在控制台上写入文件时出错,而且我得到了一些冗余数据!!!
    • @AaymanKhalid 阅读更新后的答案。您的 file_buffer 不是字符串,您正在使用 %s 打印其内容。这是您代码中的另一个错误。