如何接收服务器发送的所有数据?

时间:2015-03-25 07:01:57

标签: c++ arrays sockets char

我们有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

3 个答案:

答案 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的值应该被理解为最小值。