C 从套接字读取时追加到缓冲区
嗨,我正在尝试实现TCP套接字流。我有一个大小为12的缓冲区,我在循环中读入这个缓冲区 我希望每次读取调用时,读取操作都会添加到缓冲区中,直到缓冲区已满,但相反,它会从缓冲区的开头开始,在每次迭代时覆盖缓冲区中已经存在的内容 如何在每次读取时附加到缓冲区,以便保留以前的字节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)
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'
字符留出空间。是的,谢谢。