отправка массива структур через сокет - PullRequest
0 голосов
/ 22 ноября 2018

Что если бы у меня был массив struct.Могу ли я отправить массив структур через сокет?Размер структуры будет постоянно обновляться, и в любое время я смогу распечатать содержимое структур.Я надеюсь, что это имеет смысл, мое объяснение не может быть очищено.Мой синтаксис определенно не корректен для некоторых областей, это всего лишь фрагмент того, что, я думаю, будет выглядеть.Мне просто нужно некоторое руководство.

Это отправит массив структур через сокет.

void sendOpenMessage(int num0, int num1, int num2){

  struct openMessage{
     int num0;
     int num1;
     int num2

  };
  struct openMessage open[100];
  int i = 0;
  open[i].num0 = 1;
  open[i].num1 = 2;
  open[i].num2 = 3;  

  int length = sizeof(open);
  if(send(socket, &open[i], length, 0) == -1){
       fprintf(stderr, "Send() failed");
  }else{
      printf("Open message is being sent\n");
  }
  i++;
} 

Это получит структуру и отобразит содержимое в сообщении

  struct openMessage open[100];
  if(recv(clnSocket, &open, sizeof(open), 0) < 0){
      fprintf(stderr,"Recv() failed\n");
      printf("Error code: %d\n", errno);
  }

  //Get size of the current struct 
  //Print out the messages from the structs that have messages?
  void printStruct(struct openMessage open){
     for(int i = 0; i < sizeof(the struct); i++){
           printf("%d\n",open[i].num0);
           printf("%d\n", open[i].num1);
           printf("%d\n", open[i].num2);
     }
  }

1 Ответ

0 голосов
/ 22 ноября 2018

Прежде всего, вам нужно прочитать о порядке байтов и сериализации.

Во-вторых, length - это размер всего массива, поэтому, когда i равен нулю, вы отправляете весь массив,когда i равен 1, вы отправляете все, кроме первого элемента, плюс мусор в конце и так далее.В-третьих, при получении вы перебираете sizeof(the struct) членов массива.Разве вы не хотите перебирать весь массив?

Когда вы говорите the struct size will be updated continuously, имеете ли вы в виду количество элементов в массиве?Ваша структура имеет фиксированный размер.

Если вы отправляете переменное количество данных, т.е. если вы хотите отправить фрагмент данных, который имеет одну длину в одно время и другую длину в другое время, или даже если выЕсли вы хотите, чтобы количество элементов в массиве обновлялось динамически, вы ДОЛЖНЫ отправить этот размер через сокет и отправить его перед данными.Сначала отправьте размер, прочитайте его сначала на принимающей стороне, а затем получающая сторона узнает, сколько еще данных нужно прочитать, и, что более важно, где заканчиваются данные, так что, если будет больше данных позже, не все смешаютсядо.

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