我正在尝试将接收到的数据添加到需要在运行时配置的缓冲区(我从文件或命令行读取大小)。
所以基本上我确定我的buffersize
并使用calloc
分配一个内存区域(如果它不在配置文件或命令行中,我还设置了一个缓冲区 - 让我们假设我们暂时使用它。)
我只提供适用的代码行。
int buffersize=10000;
void *BuffPtr = (void *)calloc(1,buffersize * sizeof(char));
然后我从UDP获得recv
(我尝试接收到char数组并动态分配数组 - 两者都工作正常)
// Setup socket......
void *PktBuff = (void *)calloc(1,1000 * sizeof(char));
// Loop and receive many packets......
rcvd_bytes=recv(recv_socket, PktBuff, 1000, 0);
此时,我可以编写PktBuff
的内容,它可以正常工作。但是我希望在动态分配的数组(上面定义的BuffPtr
)中连接多个收到的数据包。
我已经尝试过strcat,但是如果我尝试写入收到的第一个数据包而没有获得另一个数据包,我就会把垃圾拿出来。
strcat(BuffPtr, PktBuff);
我做错了什么?
提前致谢。
答案 0 :(得分:3)
您的数据似乎不是以0结尾的字符串,您可能希望改为使用memmove
。
答案 1 :(得分:2)
几点和观察:
malloc()
的返回值。sizeof (char)
是一种写作1
的冗长方式,乘以它很少提供信息。size_t
计数器来跟踪BuffPtr中的字节数,并使用它并memcpy()
追加。答案 2 :(得分:0)
好的,代码strcat中的一些问题不是追加二进制数据的正确方法。这是一个半稳健的实现。我没有检查它的语法错误,只是输入它,请将其作为示例进行研究,并将其调整为您的代码。
/* total number of bytes you are willing to receive in single a single receive */
#define MAX_RECV_BUFFER 1000
/* total number of bytes you are willing to store in memory */
#define MAXBYTES MAX_RECV_BUFFER*1000
int append_bytes() {
char rcvbuf[MAX_RECV_BUFFER]; /* buffer where things are received */
void *buf = NULL; /* buffer where bytes are collected */
size_t rcvlen; /* length of data received */
size_t buflen = 0; /* total bytes */
while(1) {
void *p;
rcvlen = recv(recv_socket, rcvbuf, MAX_RECV_BUFFER, 0);
if ( rcvlen < 0 ) { manage_error(); }
if ( rcvlen == 0 )
break;
if ( buflen + rcvlen > MAXBYTES)
break;
p = realloc(buf, buflen+recvlen);
if ( !p ) { manage_memory_error(); }
buf = p; /* we have enough space */
memcpy(buf+buflen, rcvbuf, recvlen); /* append new content to end of buffer */
buflen+=recvlen; /* add length to buflen */
}
}