如果忘记加括号()你应该重新写你
if( data=recvfrom(sd, file_buffer, sizeof(file_buffer), 0, (struct sockaddr *) &server, &server_length)
原因:
< 的优先级高于 = 所以在你的 if() 中首先执行 < 然后 =
这个原因在数据读取成功时分配data 或0,当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 一起使用,但请确保您没有在代码的其他部分出错。