-1

我正在尝试通过 UDP 套接字接收文本文件,然后再次将其保存为文本文件。代码构建良好,但运行时,输出是一个空白控制台,并且文本文件也没有创建。经过一番研究,我发现我应该将接收到的字节数提供给fwrite函数,所以我尝试使用该size_t类型,但它对我没有帮助:(。

这是我的代码片段:

char file_buffer[100];
while(1)
{
    // Tranmsit data to get file /
    server_length = sizeof(struct sockaddr_in);
    if (sendto(sd, send_buffer, (int)strlen(send_buffer) + 1, 0, (struct sockaddr  *)&server, server_length) == -1)
    { 
        fprintf(stderr, "Error transmitting data.\n");
        closesocket(sd);
        WSACleanup();
        exit(0);
    }
    size_t data=0;
    if(data=recvfrom(sd, file_buffer, BUFFER_SIZE, 0, (struct sockaddr *) &server, &server_length)<0)
    {
        printf("Error receiving file.");
        exit(1);
    }        

    FILE *fp=NULL;
    fp = fopen("new_file.txt","w+");
    fwrite(file_buffer, 1, data, fp);
    {
        printf("Error writing file! \n");
        exit(1);
    }
    fclose(fp);
    printf("File received:)\n");        
}

如果有人让我知道我的错误是什么,我将不胜感激。

4

1 回答 1

1

由于运算符优先级,这是一个错误:

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

as<的优先级高于=. 这意味着data将根据测试结果分配1或分配。改成:0<

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

在继续使用之前确保文件已经被实际打开fp,检查结果fwrite()判断状态,查询errno判断失败原因:

FILE *fp = fopen("new_file.txt","w+");
if (fp)
{
    if (fwrite(file_buffer, 1, data, fp) != data)
    {
        fprintf(stderr, "Error writing file: %s\n", strerror(errno));
        exit(1);
    }
    fclose(fp);
    printf("File received:)\n");
}
else
{
    fprintf(stderr, "Error opening file: %s\n", strerror(errno));
}
于 2013-04-05T08:21:16.433 回答