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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Передача String через сокеты 
:(
    Опции темы
ezekil
Дата 24.4.2012, 11:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Подскажите пожалуйста как передать через TClientSocket стринговую переменную через SendBuf.
Отправляю так:
Код

String a;
a = "qwerty";
ClientSocket1->Socket->SendBuf(&a, SizeOf(a));


Принимаю так:

Код

String a;
ServerSocket1->Socket->RecieveBuf(&a, SizeOf(a));
ShowMessage (a);


В итоге с клиента отправляется всё как надо, а приходит на сервер NULL.
PM MAIL   Вверх
disputant
Дата 24.4.2012, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ezekil @ 24.4.2012,  11:52)
Код

String a;
ServerSocket1->Socket->RecieveBuf(&a, SizeOf(a));
ShowMessage (a);


В итоге с клиента отправляется всё как надо, а приходит на сервер NULL.

Говорю сразу - как выглядит класс String, не знаю - это явно не стандарт C++, но на 99.9% уверен, что проблема в SizeOf(a) (опять же, что именно возвращает эта функция - не уверен, но явно в String просто так буфер для размещения данных по умолчанию не выделен...
PM MAIL   Вверх
ezekil
Дата 24.4.2012, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Может для этого использовать char? Но с ним тоже ничего не выходит :(
PM MAIL   Вверх
disputant
Дата 24.4.2012, 18:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ezekil @ 24.4.2012,  15:32)
Может для этого использовать char? Но с ним тоже ничего не выходит :(

Смотря как использовать smile
Код

char buf[BUFSIZE];
recv(buf, sizeof(buf));

что-то в этом духе делаете?

Да и вы уверены, что отправляется именно строка? (Еще раз - я используемую вами библиотеку не знаю, в стандарт она не входит, так что ничего уверенно сказать не могу...) Как вы это проверяете?

Это сообщение отредактировал(а) disputant - 24.4.2012, 18:19
PM MAIL   Вверх
ezekil
Дата 24.4.2012, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Да да делаю что-то вроде того. Проверяю в отладчике.
А что если использовать Winsock? Там будет подобная пролема или там всё нормально передаётся?
PM MAIL   Вверх
disputant
Дата 24.4.2012, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(ezekil @ 24.4.2012,  20:22)
Да да делаю что-то вроде того. Проверяю в отладчике.
А что если использовать Winsock? Там будет подобная пролема или там всё нормально передаётся?

Ну, я давно написал для себя соответствующий класс и с низким уровнем напрямую давно дела не имел smile

Но вызов примерно

Код

char buf[BUFLEN];
recv(socket,buf,BUFLEN,0);


вполне работающий. Только вы уверены, что у вас отправка работает правильно?
PM MAIL   Вверх
alexvs11
Дата 24.4.2012, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


hell is here
**


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

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



Цитата(ezekil @  24.4.2012,  11:52 Найти цитируемый пост)
String a;ServerSocket1->Socket->RecieveBuf(&a, SizeOf(a));ShowMessage (a);

этот String выглядит скорее всего отдаленно так
Код

class String {
...
   String(char* c_string) { buffer = strdup (c_string); }
   char* buffer;
...
}

те по сокету вы радостно передаете структуру с указателем из совершенно другого процесса
это я про то, почему у такого хода не было шансов
то что вы пытались делать называется сериализация (и десериализация) и выглядеть он должна точно не так


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


Новичок



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

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



Цитата(disputant @  24.4.2012,  21:47 Найти цитируемый пост)
Только вы уверены, что у вас отправка работает правильно?
 
Теперь уже и не знаю. Но думаю, что правильно. 
Спасибо disputant, буду разбираться дальше  smile и Спасибо alexvs11 за сериализацию и десериализацию. Пойду про это почитаю  smile 
PM MAIL   Вверх
SVN74
Дата 25.4.2012, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

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



// Отправка
String a;
a = "qwerty";
int myLength = a.Length();
ClientSocket1->Socket->SendBuf(&myLength, sizeof(int));
ClientSocket1->Socket->SendBuf( a.c_str(),  myLength );

// Прием
int tmp_Length;
ServerSocket1->Socket->RecieveBuf(&tmp_Length, sizeof(int));
char *tmp_string = new char[tmp_Length];
ServerSocket1->Socket->RecieveBuf(tmp_string, tmp_Length);
String A;
A = tmp_string;
delete [] tmp_string;

ShowMessage (A);

PM MAIL WWW   Вверх
ezekil
Дата 26.4.2012, 00:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



SVN74, спасибо большое! Это именно то, что нужно  smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




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


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

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