На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
    > Отправка структуры по TCP (protobuf) - C Linux
      Здравствуйте
      Суть вопроса
      Есть задание обмена сообщения между сервером и клиентом сообщения сериализуются/десереализуются при помощи protobuf
      собственно сама вопрос как отправить по TCP сериализованное сообщение а на другой стороне его же и извлечь?
      вот так вот сериализую и отправляю
      ExpandedWrap disabled
        AMessage msg = AMESSAGE__INIT;
            void *buf;                    
            unsigned len;
         
            msg.stroka="message from the client";
            msg.t = 3;
            msg.dlinastroki = strlen(msg.stroka);
            fprintf(stderr,"PARAMETRS %d %s %d\n",msg.t,msg.stroka,msg.dlinastroki);
            len = amessage__get_packed_size(&msg);
            buf = malloc(len);
            amessage__pack(&msg,buf);
            fprintf(stderr,"Writing %d serialized bytes\n",len);
        if (send(sock, buf,len, 0) != len)
                DieWithError("send() sent a different number of bytes than expected");


      вот так вот принимаю и распаковываю

      ExpandedWrap disabled
        AMessage *msg;
           uint8_t buf[MAX_MSG_SIZE];
        size_t msg_len =sizeof(MAX_MSG_SIZE);
            if ((recvMsgSize = recv(clntSocket, buf,msg_len, 0)) <msg_len)
                DieWithError("recv() failed");
          
           // size_t msg_len =sizeof(MAX_MSG_SIZE);
            printf("recover 1\n" );
            msg = amessage__unpack(NULL, msg_len, buf);
         
            printf(" stroka=%s\n",msg->stroka);

      но код не работает
      есть ощущение что сообщение отправляется все таки но не извлекается при извлечении появляется вот такая ошибка
      data too short after length-prefix of 23
      make: *** [serv] Segmentation fault (core dumped)
        Так сразу

        ExpandedWrap disabled
          size_t msg_len =sizeof(MAX_MSG_SIZE);


        это переменная или define

        Сначала вытащи это в стандартный вывод или файл.

        Добавлено
        Это к то что размер принимаемых данных 4 максимальный
          ter_nk_да вы правы с define разобрался это я затупил
          но проблемы это не решило
            Цитата maxim1988 @
            есть ощущение что сообщение отправляется все таки

            Странная для программиста новая категория - "ощущение" :)
            Практически любой сниффер позволит вам точно определить, что пришло, когда и сколько.
            Кстати, вот здесь есть очень хороший пример использования protobuf для клиент/серверного приложения.
            Сообщение отредактировано: Oleg2004 -
              Oleg2004есть ощущение просто к слову пришлось
              wireshark показывает что все отправляется но извлечь не выходит

              Добавлено
              Oleg2004ну и да пример плюсовый мне нужен на чистом си
              понимаю что можно сделать по аналогии но в плюсах я не силен вообще
                Цитата maxim1988 @
                мне нужен на чистом си
                понимаю что можно сделать по аналогии но в плюсах я не силен вообще

                Не надо сразу сдаваться. :no:
                Сейчас примеры на чистом Си найти можно разве только что в книжках.
                В том примере нет ни классов, ни наследования и всего прочего. Пара тройка может быть пока непонятных моментов - почитайте и все станет на свои места. Основная логика ведь не языком определяется. А сокетные операции - так они вообще чисто сишные.
                Потратьте пару часов - и все будет ОК! :)
                Цитата maxim1988 @
                wireshark показывает что все отправляется но извлечь не выходит

                Значит два варианта - или сериализуете криво, или десериализуете - криво.
                Надо попробовать сделать и то и другое просто на одной машине без пересылки по сети.
                Если все пройдет - тогда уж пенять на сеть...или по крайней мере на формирование сетевых операций.
                  Цитата Oleg2004 @
                  Надо попробовать сделать и то и другое просто на одной машине без пересылки по сети.


                  Так и я же говорю - файл и сравни два файла.
                    Цитата ter_nk_ @
                    Так и я же говорю - файл и сравни два файла.

                    Я позволил себе вашу мысль изложить более системно... :)
                      в общем во всем разобрался все сделал всем спасибо за помощь если кому интересно могу скинуть код

                      а вообще все задание выглядело вот так

                      Нужно написать сервер и 2 типа клиента.
                      На сервере работает синхронизированная очередь из N сообщений. Идет прием сообщений и отправка клиентам одновременно по TCP протоколу.

                      Если очередь не заполнена, то сервер каждые K секунд посылает UDP пакет "Жду сообщений" в локальную сеть. Если клиент 1-го типа получает этот пакет, то отправляет по TCP сообщение (время T обработки сообщения, длина случайной строки, случайная строка) . После отправки сообщения клиент засыпает на время T. Строка случайной длины и время T - генерируется случайно, максимальная длина строки и интервал времени задается через константы. Как только очередь заполняется, то сервер перестает слать UDP оповещение.

                      Если в очереди есть сообщения, то сервер посылает каждые L секунд UDP пакет "есть сообщения" в локальную сеть.
                      Клиент 2-го типа получив такой UDP пакет устанавливает соединение с сервером и получает по TCP от сервера сообщение со строкой. Обрабатывает T секунд(просто спит) и только после сможет опять получать сообщения. Как только очередь опусташается, то сервер перестает слать UDP оповещение.

                      Кол-во клиентов 1-го и 2-го типа может быть неограниченно.
                      Реализовать сервер и клиенты на языке С. Использовать компилятор gcc. Стандарт языка С99. Результаты выкладывать на git сервер http://bitbucket.org.
                      Допускается написание сервера на Java, а клиенты на С.
                      Для упаковки и распаковки сообщения между клиентами и сервером использовать библиотеку protobuf-c.
                      https://github.com/protobuf-c/protobuf-c
                      Сообщение отредактировано: maxim1988 -
                        Да хотелось бы исходники плсмотреть,интересно

                        Добавлено
                        maxim1988поделишься?
                        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                        0 пользователей:


                        Рейтинг@Mail.ru
                        [ Script execution time: 0,0302 ]   [ 16 queries used ]   [ Generated: 28.03.24, 06:29 GMT ]