我正在尝试通过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);
}
答案 0 :(得分:3)
如果您忘记添加括号()
,则应重新编写if(data = recvfrom(sd,file_buffer,sizeof(file_buffer),0,(struct sockaddr *)&amp; server,&amp; server_length)&lt; 0)
<强>原因:强>
<
的优先级高于=
因此,在您执行的if()<
=
之后data
这个原因会在成功读取数据时为0
分配1
,在recvfrom()
错误时返回-1
时if(data = 1 < 0)
分配recvfrom()
。
看@ C Operator Precedence Table
您的代码是成功读取的设备:
if(data = -1 < 0)
并且if( (data = recvfrom() ) < 0)
^ ^ added in your code
失败了:
\0
<强>错误强>?实际上你忘了()括号(或者如果你不知道你要加上。)就像:
if((data = recvfrom(sd,file_buffer,sizeof(file_buffer),0,(struct sockaddr *)&amp; server,&amp; server_length))&lt; 0)
请参阅我添加的():
0
修改:
第二个错误:“缓冲区未'\0'
终止”
函数recvfrom()如果成功,则返回消息或数据报的长度(以字节为单位)。如果收到文件结束条件或关闭连接,则返回'%s'
。
需要注意的是它不会将file_buffer[]
符号放到终止缓冲区。并且您使用sizeof(file_buffer)
来打印\0
的内容除了null终止的字符串,它也会在运行时导致未定义的行为(如果没有得到分段错误,你可能会在控制台上得到不寻常的符号)。
如果要将文件缓冲区用作字符串,则应始终读取no_Of_bytes =recvfrom(
sd,
file_buffer,
sizeof(file_buffer) - 1,
0,
(struct sockaddr *) &server,
&server_length
);
file_buffer[no_Of_bytes] = '\0';
中的一个并显式地显示null file_buffer
。
我建议你这样做:
%s
现在您的{{1}}空终止,您可以使用{{1}},但请确保您不会在代码的其他部分出错。