Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> вопрос по чтению строк. 
V
    Опции темы
dgolukas
  Дата 6.2.2010, 22:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



суть вопроса)
есть мессенджер который прекрасно отправляет пакеты и читает их методом Read
Код

inline void PacketReader::Read(Socket& sock, Packet& packet)
{
   std::cout << "**Packet received**" << std::endl;
   int type;
   int size;

   sock.read(&type,sizeof(type));
   sock.read(&size,sizeof(size));

   PacketHeader *header = new PacketHeader((PacketType)type, size);
   std::cout << "Packet size: " << header->getSize() << std::endl;

   char* data = new char [size];
   int readCount = sock.read(data, size); 

   Packet pack(header, data);
   packet.setPacketHeader(header);

   std::string *str = new std::string(data);
   std::cout << "Packet data: " << *str << std::endl;

   packet.setPacketData(*str);
}


все было бы прекрасно, если бы этим методом они считывались вместе с пробелами, а так он читает только одну строку до пробела.
я переписала метод вот так и он стал читать строки полностью, но перестал отправлять.
Код

inline void PacketReader::Read(Socket& sock, Packet& packet)
{
  std::cout << "**Packet received**" << std::endl;
  int type;
  int size;
  sock.read(&type,sizeof(type));
  sock.read(&size,sizeof(size));
  PacketHeader *header = new PacketHeader((PacketType)type, size);
  std::cout << "Packet size: " << header->getSize() << std::endl;
  std::string data; //new
  data = packet.getPacketData(); //new
  std::cout<<"getPacketData "<<data<<std::endl; //output data
 
  int readCount = sock.read((void*)(data.c_str()), size); //new
  Packet pack(header, (char*)(data.c_str()));
  packet.setPacketHeader(header);
   std::cout << "Packet data: " <<data<< std::endl; //new
  std::cout << "*******************" << std::endl;
  packet.setPacketData(data);
}

может быть есть еще варианты??
хотелось бы чтобы и пакеты отправлялись и читались целиком((

АПДЕЙТ!!!!
ошибка оказывается не в этом классе, а вот здесь, почему-то считывает сообщение до первого пробела:
Код

    long receiver;
    std::string message;
    
    std::istringstream istream(packet.getPacketData());
    istream>>receiver;
    istream>>message;



Это сообщение отредактировал(а) dgolukas - 7.2.2010, 19:52
PM MAIL   Вверх
andrew_121
Дата 6.2.2010, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Код

  int readCount = sock.read((void*)(data.c_str()), size); //new
  Packet pack(header, (char*)(data.c_str()));

думаю ошибка здесь.
скажите, "sock.read" читает в "data.c_str()" объем равный "size" ?

Добавлено через 2 минуты и 36 секунд
Цитата(dgolukas @  6.2.2010,  22:36 Найти цитируемый пост)
PacketHeader *header = new PacketHeader((PacketType)type, size);

кстати здесь утечка памяти. объект "header" не удаляется. или же он производится фабрикой/синглтоном?


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 6.2.2010, 23:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



ммм.
вообще-то дату он же получает из пакета.
а size пакета  чуть выше выкачивается.

т.е. вы думаете, у меня просто выход за границы, да??

.. щас проверку поставлю попробую кэтчем поймать.

з.ы. andrew_121, мне кажется когда я доделаю этот мессенджер, я вам минимум ящик пива задолжаю))))

Это сообщение отредактировал(а) dgolukas - 6.2.2010, 23:28
PM MAIL   Вверх
andrew_121
Дата 6.2.2010, 23:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(dgolukas @  6.2.2010,  23:27 Найти цитируемый пост)
т.е. вы думаете, у меня просто выход за границы, да??

я думаю что переменная "size" имеет значение меньше чем нужно. потому пакет не полный. это только предположение.

Цитата(dgolukas @  6.2.2010,  23:27 Найти цитируемый пост)
з.ы. andrew_121, мне кажется когда я доделаю этот мессенджер, я вам минимум ящик пива задолжаю))))

а что за мессенджер такой? в чем-то особенный?
да, по пиву было бы не плохо smile шутка!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 6.2.2010, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 6.2.2010,  23:36)
я думаю что переменная "size" имеет значение меньше чем нужно. потому пакет не полный. это только предположение.

а что за мессенджер такой? в чем-то особенный?
да, по пиву было бы не плохо smile шутка!

по теме вопроса. я поставила кэтч, он экспшн почему-то не выбрасывает но зато вызывает сразу дисконнект) 
наверное, в этом дело да. порою еще

мессенджер - это просто клиент-серверное приложение на базе TCP/IP ну с собственным протоколом.. 
типа выпускной проект на курсах.. 
но я немного увлеклась и сделала вместо учебного проекта полноценное приложение)
так вот. первая моя программа, если не считать лабораторных хелловорлдов и тому подобное

а вы кст в каком городе базируетесь?))

з.ы. да  где header утечка была. пофиксила) я фабрику не пользую.. я оставила в пакете enum  и в PacketDispatcher прописала свитч)

Это сообщение отредактировал(а) dgolukas - 6.2.2010, 23:54
PM MAIL   Вверх
andrew_121
Дата 6.2.2010, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(dgolukas @  6.2.2010,  23:47 Найти цитируемый пост)
мессенджер - это просто клиент-серверное приложение на базе TCP/IP ну с собственным протоколом.. 
типа выпускной проект на курсах.. 
но я немного увлеклась и сделала вместо учебного проекта полноценное приложение)
так вот. первая моя программа, если не считать лабораторных хелловорлдов и тому подобное

прикольно. обычно студенты не столь любят учиться smile 
по завершению, выложите проект куда-то? на гуглкод к примеру.


Цитата(dgolukas @  6.2.2010,  23:47 Найти цитируемый пост)
а вы кст в каком городе базируетесь?)) 

написал в личку.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 7.2.2010, 00:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 6.2.2010,  23:54)
прикольно. обычно студенты не столь любят учиться smile 
по завершению, выложите проект куда-то? на гуглкод к примеру.


в том-то и дело, что я не совсем студент.
для себя пошла учить программинг, и увлеклась))
не думала, что так затянет.

когда доведу до ума -  скину вам обязательно)
PM MAIL   Вверх
andrew_121
Дата 7.2.2010, 00:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(dgolukas @  7.2.2010,  00:01 Найти цитируемый пост)
в том-то и дело, что я не совсем студент.
для себя пошла учить программинг, и увлеклась))
не думала, что так затянет.

крайне необычным синдром для девушки smile 
кто-то во флейме оч хотел познакомиться с девушкой увлекающейся IT. могу подсказать. задачки будет решать. а что?....и то польза smile

Добавлено через 48 секунд
что-то мы наоффтопили. щас придет дядя модератор, и всыпит нам по первое число smile 


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
dgolukas
Дата 7.2.2010, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(andrew_121 @ 7.2.2010,  00:04)
крайне необычным синдром для девушки smile 
кто-то во флейме оч хотел познакомиться с девушкой увлекающейся IT. могу подсказать. задачки будет решать. а что?....и то польза smile

Добавлено @ 00:05
что-то мы наоффтопили. щас придет дядя модератор, и всыпит нам по первое число smile

наоффтопили хорошо- да)))

не, я сама скоро любому решальщику фору дам такими темпами)))
PM MAIL   Вверх
NewDima
Дата 7.2.2010, 03:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 922
Регистрация: 20.2.2006
Где: <?here?>

Репутация: нет
Всего: 12



Цитата

Код

   sock.read(&type,sizeof(type));
   sock.read(&size,sizeof(size));

   std::cout ... << header->getSize()...;

   char* data = new char [size];


Эмм, это что? PacketHeader::getSize() возвращает размер чего? Наверное самого хеадера? (странно, зачем, если он по коду прямо зависит от типа пакета).
Код

   Packet pack(header, data);
   packet.setPacketHeader(header);
...
   packet.setPacketData(*str);

Смеяться не буду. Сначала заведена переменная pack класса (структуры?) Packet, а потом обращение к packet... Если опечатка, тогда зачем передавать параметры в конструктор, а потом их устанавливать еще отдельно?
Второй код тоже, извините, ерунда похожая, тщательно не всматривался.
З.Ы. ИМХО пытаться использовать инлайн для этого бредово =)
PM ICQ   Вверх
dgolukas
Дата 7.2.2010, 11:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(NewDima @ 7.2.2010,  03:47)
Эмм, это что? PacketHeader::getSize() возвращает размер чего? Наверное самого хеадера? (странно, зачем, если он по коду прямо зависит от типа пакета).

Смеяться не буду. Сначала заведена переменная pack класса (структуры?) Packet, а потом обращение к packet... Если опечатка, тогда зачем передавать параметры в конструктор, а потом их устанавливать еще отдельно?

З.Ы. ИМХО пытаться использовать инлайн для этого бредово =)

мммм std::cout с getSize() я впихнула, когда ошибку искала, чтобы выводил значение в консоли.) больше никакой смысловой нагрузки он не несет))

убрала локальный pack,да он вообще не в тему.

не понимаю, в чем именно ерунда и где искать ошибку

з.ы. инлайн я впихнула, когда написала реализацию метода в хиддере, и он очень слезно порсил файл спп))
PM MAIL   Вверх
Леопольд
Дата 7.2.2010, 13:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 943
Регистрация: 17.6.2009

Репутация: 10
Всего: 13



Цитата(dgolukas @  6.2.2010,  22:36 Найти цитируемый пост)
PacketHeader *header = new PacketHeader((PacketType)type, size);

Код

#include<memory>
//...
PacketHeader *header = new PacketHeader((PacketType)type, size);
std::auto_ptr<PacketHeader> cleaner(header); //Это лучше чем delete в конце, потому что освободит память в случае любого неожиданного исключения.
//...



--------------------
вопросов больше чем ответов
PM MAIL   Вверх
dgolukas
Дата 7.2.2010, 19:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 50
Регистрация: 30.8.2009

Репутация: нет
Всего: нет



Цитата(Леопольд @ 7.2.2010,  13:28)
std::auto_ptr<PacketHeader> cleaner(header); //Это лучше чем delete в конце, потому что освободит память в случае любого неожиданного исключения.
//...


ого, я про такое и не слышала никогда, спасибо!!!)




вобщм, после длительного дебага выяснилось, что ошибка не в ридере и даже не в сендере, а в классе с графикой.
а именно в том,что там юзается QString и я пока не поняла как можно безболезненно с сохранением инфы перевести стандартные строки в это вот чудо.
собственно вот.
все доходит все приходит, просто в браузере не отображается.
со стандартными строками категорически работать отказывается выдавая эксепшн, что не может строки поставить в очередь
за сим тему можно считать закрытой))

Это сообщение отредактировал(а) dgolukas - 8.2.2010, 00:45
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0546 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.