只是为了确定...下面的代码是否应该打印出服务器发送的内容?
我收到了一些不需要的模式,例如^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);
}
答案 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)通常是一个不错的选择。