Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 从套接字读取时追加到缓冲区_C_Sockets_Buffer - Fatal编程技术网

C 从套接字读取时追加到缓冲区

C 从套接字读取时追加到缓冲区,c,sockets,buffer,C,Sockets,Buffer,嗨,我正在尝试实现TCP套接字流。我有一个大小为12的缓冲区,我在循环中读入这个缓冲区 我希望每次读取调用时,读取操作都会添加到缓冲区中,直到缓冲区已满,但相反,它会从缓冲区的开头开始,在每次迭代时覆盖缓冲区中已经存在的内容 如何在每次读取时附加到缓冲区,以便保留以前的字节 void*th_读取(void*arg) { reader_arg_t*rArg=(reader_arg_t*)arg; int buf_size=12; 接收的int字节,rv; 字符大小[buf_size]; 而(1)

嗨,我正在尝试实现TCP套接字流。我有一个大小为12的缓冲区,我在循环中读入这个缓冲区

我希望每次读取调用时,读取操作都会添加到缓冲区中,直到缓冲区已满,但相反,它会从缓冲区的开头开始,在每次迭代时覆盖缓冲区中已经存在的内容

如何在每次读取时附加到缓冲区,以便保留以前的字节

void*th_读取(void*arg)
{
reader_arg_t*rArg=(reader_arg_t*)arg;
int buf_size=12;
接收的int字节,rv;
字符大小[buf_size];
而(1)
{
rv=0;
接收的字节数=rv;
memset(buf,0,buf_大小);
socket\u context\u t ctx;
tsq_出列(rArg->reader_队列和ctx);
printf(“从套接字读取:%i\n”,ctx.sockfd);
而(1)
{
rv=读取(ctx.sockfd,buf,buf_大小-接收的字节);
如果(rv<1)
打破
接收的字节数+=rv;
printf(“接收的字节数:%i\n缓冲区:%s\n”,接收的字节数,buf);
}
佩罗(“阅读”);
关闭(ctx.sockfd);
printf(“%s\n”,buf);
}
}
当我连接到telnet并按enter键写2次时,我得到这个输出。第一次写
hello
,第二次写数字
1

reading from socket: 5
bytes_recevied: 7
buf: hello

bytes_recevied: 10
buf: 1
lo
我希望缓冲区包含
hello1
,而不是
1\rlo

我发现了一个显示零字节的问题,但它对我的用例没有用处,除非我可能会使用第二个缓冲区,并在每次读取时添加从第一个缓冲区到零字节的内容


您应该将缓冲区的新位置发送到读取功能中

rv = read(ctx.sockfd, buf + bytes_received, buf_size - bytes_recevied);

使用
printf(“接收的字节数:%i\n缓冲区:%s\n”,接收的字节数,buf)无法保证您试图输出为字符串的缓冲区实际上是一个正确终止的字符串。即使使用
memset()
,因为如果
read()
调用填充缓冲区,您没有为正确终止
'\0'
字符留出空间。是的,谢谢。