我正在接收字符串并将其保存到输入缓冲区中。这是流和字符串可能不完整,所以我正在寻找最后一个STOP - 字符串,复制其余的(这是下一个块的开头)并附加复制数据后面的下一个传递的数据。
在中间我对输入缓冲区执行一些操作(如memcpy)。我应该复制输入缓冲区还是可以使用input_buffer,我有吗?
有些人告诉我,这没有任何意义:
if ( bytes_received == 0 ) {
continue;
}
但这是流。如果这没有意义,我怎么能保证,我会不断收到数据?
char * strrstr(char *string, char *find, ssize_t len)
{
char *cp;
for (cp = string + strlen(string) - 4; cp >= string; cp--)
{
if (strncmp(cp, find, 4) == 0)
return cp+4;
}
return NULL;
}
int main ( void ) {
char * input_buffer = malloc(MAXLENGTH);
size_t restSize=0;
char * restP;
int socket_handle = reqData(subStr);
ssize_t bytes_received ;
for (;;) {
bytes_received = recv ( socket_handle , input_buffer+restSize ,MAXLENGTH-1, 0 ) ;
input_buffer[bytes_received-1] = '\0';
if ( bytes_received == -1 ) {
printf ( "-1 An error occured during the receive procedure \n" ) ;
return 0 ;
}
if ( bytes_received == 0 ) {
printf ( "0 An error occured during the receive procedure \n" ) ;
return 0 ;
}
restP = strrstr (input_buffer, STOP, 4);
if (restP == NULL)
{
restSize = 0;
continue;
}
restSize = strlen(restP);//MAXLENGTH - (restP - input_buffer) + 1;
processXML(input_buffer, restP, t);
strcpy(input_buffer, restP);
}
close(socket_handle);
free (input_buffer);
return 0 ;
}
答案 0 :(得分:2)
您的代码中存在一些错误:
此处:input_buffer[bytes_received-1] = '\0';
您不检查bytes_recived是否为-1(您稍后会这样做)。此外,您必须检查它是否为0,因为不允许数组的负索引。哟也会这样做,所以只需移动引用的行。
考虑使用string.h中的strstr函数而不是strrstr。即使你的实现看起来很好(这是一个很好的练习,如果这是它的目的),建议使用标准函数,因为它们比你的实现更安全,这可能会隐藏一些错误。例如。
< / LI>调用recv函数时,不需要期望MAXLENGTH-1。 MAXLENGTH也会奏效。
现在,要回答您的问题,这可能很有用:recv() returns 0 如你所见,当recv返回0时,再也没有期望输入了。