C - программирование сокетов - произвольная посылка / запись - арифметика указателя - массив не может быть назначен - PullRequest
0 голосов
/ 09 июня 2018

Я хочу иметь возможность отправлять или получать произвольный объем данных через сокет с помощью вызовов send () и recv ().Чтобы учесть это, я создал цикл while, который не завершается до тех пор, пока вызовы send () или recv () не вернут 0 байтов [при условии отсутствия ошибки -1].Для учета ранее отправленных или полученных данных:

  1. отслеживайте количество возвращаемых байтов
  2. непрерывно вызывайте send () / recv (), пока функции не вернут 0
  3. обновить указатели, указывающие на данные, чтобы они ссылались только на те записи данных, которые еще не были обработаны send () / recv ().[использовать арифметику указателя]

Код, который следует ниже, является псевдо-кодом, написанным в '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);

ПОЛУЧИТЬ ЦИКЛ:

/* 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 * data[DATASIZE] вместо char data[DATASIZE]?

Ответы [ 2 ]

0 голосов
/ 09 июня 2018

Если у вас есть массив (data_buffer[total]), вы не можете переназначить новый указатель на него (или другой массив, распадающийся на указатель).Вы можете создать указатель, указывающий на массив, и переназначить его по мере необходимости (но он будет действителен только в том случае, если фактический массив все еще находится в стеке, если он был выделен в стеке).

0 голосов
/ 09 июня 2018

Перед циклом создайте отдельную переменную-указатель, которая указывает на начало массива для запуска.Затем передайте этот указатель на recv для чтения и увеличьте указатель после вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...