代码之家  ›  专栏  ›  技术社区  ›  H3G3moKnight

C-套接字编程-任意发送/接收-指针算术-数组不可分配

  •  0
  • H3G3moKnight  · 技术社区  · 8 年前

    我希望能够使用send()和recv()调用通过套接字发送或接收任意数量的数据。为了实现这一点,我创建了一个while循环,直到send()或recv()调用返回0字节(假设没有错误-1)时才会终止。说明以前发送或接收的数据:

    1. 跟踪返回的字节数
    2. 连续调用send()/recv(),直到函数返回0
    3. 更新数据中的指针点,以便只引用SDENE()/ReCVE()尚未处理的数据项。[使用指针算法]

    下面的代码是用'c'编写的psuedo代码
    发送循环:

    /* bunch of socket code above */
    ssize_t condition;
    do
    {
        ssize_t return_bytes = send(fd_socket, data, DATACHUNK, 0);
        if (return_bytes == -1)
        {
            perror("Problems sending...");
            exit(EXIT_FAILURE);
        }
        condition = return_bytes;
        data = data + return_bytes;
    } while (condition > 0);
    

    接收循环:

    /* bunch of socket code above */
    ssize_t = condition;
    ssize_t = total = 0;
    memset(data_buffer, 0, BUFFSIZE);
    do
    {
        ssize_t return_bytes = recv(fd_socket, data_buffer, BUFFSIZE - 1, 0);
        if
        {
            perror("Problems receiving...");
            exit(EXIT_FAILURE);
        }
        condition = return_bytes;
        data_buffer = data_buffer + return_bytes;
        total = total + return_bytes;
    } while (condition > 0);
    data_buffer[total] = '\0';
    

    不幸的是,当尝试升级char array[]数据缓冲区时,出现错误:“array not assignable”。我认为数组衰减为指向内存中数据块开始的指针(索引0)。如何更新指向char数组的指针,以便发送任意大小的消息?如果我将字符数据缓冲区声明为:
    char * data[DATASIZE] 而不是 char data[DATASIZE] 是吗?

    2 回复  |  直到 8 年前
        1
  •  0
  •   dbush    8 年前

    在循环之前,创建一个指向要开始的数组开头的单独指针变量。然后把指针传给 recv 在调用后读入并递增指针。

        2
  •  0
  •   nanofarad    8 年前

    如果你有一个数组( data_buffer[total] )不能重新分配指向它的新指针(或衰减为指针的其他数组)。但是,您可以创建一个指向数组的指针,并根据需要重新分配该指针(但只有当实际数组仍在堆栈上时,如果它是堆栈分配的,它才有效)。