我们有recv
function正在接收特定数量的字节。我需要编写一个函数,它返回一个指向char
的指针,该指针包含 所有 数据,由服务器响应。
char* receive_all()
{
//Don't know how...
}
事情是我无法知道服务器响应了多少字节,直到我收到,因此我无法创建一个适当大小的数组,如
char* buf = new char[1000]; //Maybe the server's response have more than 1000 bytes
答案 0 :(得分:0)
int receive(int sockfd, void *buf, size_t len, int flags)
{
size_t toread = len;
char *bufptr = (char*) buf;
while (toread > 0)
{
ssize_t rsz = recv(sockfd, bufptr, toread, flags);
if (rsz <= 0)
return rsz; /* Error or other end closed connection */
toread -= rsz; /* Read less next time */
bufptr += rsz; /* Next buffer position to read into */
}
return len;
}
答案 1 :(得分:0)
malloc和realloc函数可用于动态分配和重新分配缓冲区。如果数据真的很大,那么使用一个简单的链表。
struct node {
char buf[4096];
struct node *next;
};
为了更有效地调整缓冲区大小和服务器的页面大小,通常它是4096字节。因此,每当您从
接收数据时,您可以创建一个新节点ssize_t rsz = recv(sockfd,bufptr,toread,flags);
最后读取整个数据遍历链表。
答案 2 :(得分:-1)
您可以按ioctl(fd,FIONREAD,&bytes_available)
获取当前待处理的尺寸。由于您将问题标记为C ++,因此只需使用std::vector<char>
即可。它有一个.resize(bytes_available)
方法。
当然,数据包是异步接收的,因此bytes_available
的值应该被理解为最小值。