Recv和printf

时间:2013-11-28 16:17:24

标签: c

只是为了确定...下面的代码是否应该打印出服务器发送的内容? 我收到了一些不需要的模式,例如^M5b3^M^M800^M等。 即而不是这个:

 <P k="33,556,1" v="-0.166723"/>

我得到了这个:

<P k="33,556,1" v="-0.16672^M
2000^M
3"/>

这个代码有问题吗?或者数据是否相当损坏?

 char * input_buffer = malloc(MAXLENGTH);

 for (;;) {

    bytes_received = recv ( socket_handle , input_buffer , MAXLENGTH, 0 ) ;
    *( input_buffer+bytes_received + 1 ) = '\0';
    if ( bytes_received == -1 ) {
      printf ( "An error occured during the receive procedure \n" ) ;
      return 0 ;
    }
    if ( bytes_received == 0 )continue ;
    printf ("%s", input_buffer);
  }

2 个答案:

答案 0 :(得分:1)

如果已读取MAXLENGTH个字节,则此行

*( input_buffer+bytes_received + 1 ) = '\0';

写入超出分配的内存,这会引发未定义的行为。

它还会将0终止符写入接收到的最后一个字符的2个字节。

1要修复前者,请修改此行

char * input_buffer = malloc(MAXLENGTH);

char * input_buffer = malloc(MAXLENGTH+1);

或修改此行

bytes_received = recv ( socket_handle , input_buffer , MAXLENGTH, 0 ) ;

bytes_received = recv ( socket_handle , input_buffer , MAXLENGTH-1, 0 ) ;

2要修复后者,请修改

 *( input_buffer+bytes_received + 1 ) = '\0';

*(input_buffer+bytes_received) = '\0';

也是这一行

if ( bytes_received == 0 )continue ;

没有意义。如果recv()返回0,则表示连接已关闭。通过此套接字描述符不再需要更多数据。


总而言之,这些代码看起来更像:

char * input_buffer = malloc(MAXLENGTH+1);
/* Add error checking here. */
for (;;) {

  ssize_t bytes_received = recv ( socket_handle , input_buffer , MAXLENGTH, 0 ) ;
  if ( bytes_received == -1 ) {
    printf ( "An error occured during the receive procedure \n" ) ;
    return 0 ;
  }

  *(input_buffer+bytes_received) = '\0';

  if ( bytes_received == 0 )
    return 0;

  printf ("%s", input_buffer);
}

答案 1 :(得分:0)

^M是ASCII 13,即回车。它通常用于在基于行的文本协议中分离“消息”。

检查对方是如何进行发送的,如果您不希望通过网络接收它。如果连接是面向流的,则必须有一些分隔符,CR(或CR + LF)通常是一个不错的选择。