#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct rpc_return_data {
int wait_response;
int retu_data_len;
char retu_data[0];
} rpc_retu_data_t;

int append_recv(char *rcv_buf, int rcv_len, rpc_retu_data_t **tota_rcv_buf, int *tota_len)
{
int len;
rpc_retu_data_t *new_buf;
char *chs;
char *p;

if (rcv_buf == NULL)
{
return -1;
}

if (*tota_rcv_buf != NULL)
{
len = *tota_len + rcv_len;
new_buf = (rpc_retu_data_t *) malloc(len + sizeof(rpc_retu_data_t) + 1);
new_buf->wait_response = (*tota_rcv_buf)->wait_response;
new_buf->retu_data_len = len;
*tota_len = len;
p = (char *)new_buf;
p = p + sizeof(rpc_retu_data_t); //跨过rpc_retu_data_t头
memcpy(p, (*tota_rcv_buf)->retu_data, (*tota_rcv_buf)->retu_data_len); //把数据拷贝到头的后面
p = p + (*tota_rcv_buf)->retu_data_len; //跨过头和旧数据
memcpy(p, rcv_buf, rcv_len);
chs = (char *)new_buf;
chs[len + sizeof(rpc_retu_data_t)] = '\0';
free(*tota_rcv_buf); //释放旧数据
*tota_rcv_buf = new_buf;

} else {
len = rcv_len;
new_buf = (rpc_retu_data_t *) malloc(len + sizeof(rpc_retu_data_t) + 1);
new_buf->wait_response = 1; //这是处理读取的反馈数据,所以必然1;就是不是1,也不会错。
new_buf->retu_data_len = len;
*tota_len = len;
p = (char *)new_buf;
p = p + sizeof(rpc_retu_data_t); //跨过rpc_retu_data_t头
memcpy(p, rcv_buf, rcv_len);
chs = (char *)new_buf;
chs[len + sizeof(rpc_retu_data_t)] = '\0';
*tota_rcv_buf = new_buf;
}

return len;

}

int main(int argc, char * argv[])
{
char buf[256];
int tota_len = 0;
int len;
rpc_retu_data_t *total_buf = NULL;

memset(buf, 0, 256);
while(scanf("%s", buf))
{
len = strlen(buf);
append_recv(buf, len, &total_buf, &tota_len);
memset(buf, 0, 256);
printf("\ntotal_buf->retu_data_len=%d string=%s \n", total_buf->retu_data_len, total_buf->retu_data);
}
}

 

posted on 2021-10-29 10:02  北京开发  阅读(51)  评论(0)    收藏  举报