在c中的udp中接收文本文件

时间:2013-04-05 08:16:17

标签: c sockets udp

我正在尝试通过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");        
}

如果有人让我知道我的错误是什么,我真的很感激。

1 个答案:

答案 0 :(得分:1)

由于operator precedence

,这是一个错误
if(data=recvfrom(sd, file_buffer, BUFFER_SIZE, 0, (struct sockaddr *) &server, &server_length)<0)

因为<的优先级高于=。这意味着data将分配10,具体取决于<测试的结果。改为:

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