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

时间:2018-06-09 20:21:23

标签: c arrays sockets pointers

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

  1. 跟踪返回的字节数
  2. 不断调用send()/ recv()直到函数返回0
  3. 更新指针指向数据,以便它们仅引用尚未由send()/ recv()处理的数据条目。 [使用指针算术]
  4. 下面的代码是用'C'写的伪代码 发送循环:

    /* 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);
    

    RECEIVE LOOP:

    /* 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数组[]数据缓冲区时,我收到错误:“数组不可分配”。我认为数组衰减到指针指向内存中数据块的开始(索引0)。如何更新指向我的char数组的指针,以便我可以发送任意大小的消息?如果我将字符数据缓冲区声明为:
    ,它会有所不同吗? char * data[DATASIZE]代替char data[DATASIZE]

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

如果你有一个数组(data_buffer[total]),你就不能重新指定一个新的指针(或者一个衰减到指针的不同数组)。您可以创建一个指向数组的指针,并根据需要重新分配(但只有当堆栈分配时,实际数组仍在堆栈中才会有效。)