我正在尝试通过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");
}
如果有人让我知道我的错误是什么,我真的很感激。
答案 0 :(得分:1)
if(data=recvfrom(sd, file_buffer, BUFFER_SIZE, 0, (struct sockaddr *) &server, &server_length)<0)
因为<
的优先级高于=
。这意味着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));
}