gpt4 book ai didi

c - 不断从流中接收数据并读取流

转载 作者:太空宇宙 更新时间:2023-11-04 08:48:22 25 4
gpt4 key购买 nike

我正在接收字符串并将其保存到输入缓冲区中。这是流,字符串可能不完整,所以我正在寻找最后一个 STOP - 字符串,复制其余部分(这是下一个 block 的开始)并将下一次交付的数据附加到复制的数据后面。
在此期间,我对输入缓冲区进行了一些操作(如 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 ;
}

最佳答案

您的代码中有一些错误:

  1. 此处:input_buffer[bytes_received-1] = '\0'; 您不检查 bytes_recived 是否为 -1(稍后检查)。此外,您必须检查它是否为 0,因为不允许对数组使用负索引。你稍后也这样做,所以只需移动引用的行。

  2. 考虑使用 string.h 中的 strstr 函数代替 strrstr。即使您的实现看起来不错(这是一个很好的练习,如果这是它的目的),也建议使用标准函数,因为它们比您的实现更安全,例如可能隐藏一些错误。

  3. 调用recv函数时,不需要期望MAXLENGTH-1。 MAXLENGTH 也可以。

现在,要回答您的问题,这可能会有用:recv() returns 0如您所见,当 recv 返回 0 时,不再期望输入。

关于c - 不断从流中接收数据并读取流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20721532/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com