udp客户端接收文本文件

时间:2013-04-06 05:43:35

标签: c

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

1 个答案:

答案 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()错误时返回-1if(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}},但请确保您不会在代码的其他部分出错。