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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> преобразовать массив int в string 
:(
    Опции темы
iPlay
Дата 11.6.2011, 09:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Народ, подскажите как преобразовать массив intoв в строку. Создаю массив чисел, рандомом заполненных, но мне нужно передать с помощью сокетов эти числа, а функция send() отправляет только строку типа string как быть? Передавать не обязательно числа, на сервере никакой обработки не будет, просто по факту получение и всё.
Код

int *randomVal = new int[256];
    srand(time(0));

    for (int i = 0; i<=10; i++)
    {
        randomVal[i] = rand() % MAXDEV;    
        printf("%d\n",randomVal[i]);
    }
//send(mysocket,map.c_str(),map.length(),0);


Это сообщение отредактировал(а) iPlay - 11.6.2011, 09:25
PM MAIL   Вверх
boostcoder
Дата 11.6.2011, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



Цитата(iPlay @  11.6.2011,  09:24 Найти цитируемый пост)
функция send() отправляет только строку типа string

нет. функция send() отправляет массив байтов: http://linux.die.net/man/2/send

а отправить нужно в виде строки интов? или в виде raw массива байт?

Это сообщение отредактировал(а) boostcoder - 11.6.2011, 09:43
PM WWW   Вверх
iPlay
Дата 11.6.2011, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Только если отправлять просто переменные появляется надпись при компиляции smile)

error C2664: 'send' : cannot convert parameter 2 from 'int' to 'const char *'

+ стоит учесть что это winsock smile
PM MAIL   Вверх
boostcoder
Дата 11.6.2011, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


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

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



ответа на свой вопрос так и не получил.
вот два варианта. выбирайте сами.
Код

#include <iostream>

#include <string>
#include <sstream>

std::string as_string() {
   int *randomVal = new int[256];
   srand(time(0));
   for ( int i = 0; i < 10; ++i ) {
      randomVal[i] = rand();
   }
   
   // ...
   
   std::ostringstream os;
   for ( int i = 0; i < 10; ++i ) {
      os << randomVal[i] << " ";
   }
   
   return os.str();
}

std::string as_raw() {
   int *randomVal = new int[256];
   srand(time(0));
   for ( int i = 0; i < 10; ++i ) {
      randomVal[i] = rand();
   }
   
   // ...
   
   return std::string(reinterpret_cast<const char*>(randomVal), 10*sizeof(*randomVal));
}

int main() {
}

http://liveworkspace.org/code/6007ce272d3e...f8f4eadb9e02122
PM WWW   Вверх
iPlay
Дата 12.6.2011, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



С предыдущим разобрался , не пойму теперь почему сервер принимает только одну строку и всё, хотя я в клиенте в цикле отправляю 5-6 строк? Сервер сразу после приема первой строки завершает работу. 
Код

   bind(mysocket,(sockaddr*)&socketaddr,sizeof(socketaddr)); 
               
        listen(mysocket,SOMAXCONN); 

        cout << "-------------------->\n";
        cout << "Waiting for the Client..." << endl;
 
        char buffer[110000];
            while ((mysocket = accept(mysocket,0,0)) != INVALID_SOCKET)
            {
                cout << "Client Connected" << endl;
                
                int ret = recv(mysocket, buffer, 110000, 0);    
                buffer[ret] = '\0';
                cout << "Message = " << buffer << endl;    
                cout << "--------------------->\n";
            }
        closesocket(mysocket);

PM MAIL   Вверх
asmdzen
Дата 12.6.2011, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



то есть 
Цитата(iPlay @  12.6.2011,  08:33 Найти цитируемый пост)
 в цикле отправляю 5-6 строк

а получить пытаемся одним recv? сокет выдаст вам первый же полученный пакет и все, напишите и для получения цикл, который будет выходить при закрытии соединения или при каком-то пакете.

PM MAIL   Вверх
iPlay
Дата 12.6.2011, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А как узнать что соединение было закрыто?
PM MAIL   Вверх
asmdzen
Дата 12.6.2011, 14:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



recv вернет 0
PM MAIL   Вверх
iPlay
Дата 12.6.2011, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Чёто не получается:( Не могу понять как цикл сделать??? Основывая на текущем примере.
Код

 bind(mysocket,(sockaddr*)&socketaddr,sizeof(socketaddr)); 
               
        listen(mysocket,SOMAXCONN); 
        cout << "-------------------->\n";
        cout << "Waiting for the Client..." << endl;
 
        char buffer[110000];
            while ((mysocket = accept(mysocket,0,0)) != INVALID_SOCKET)
            {
                cout << "Client Connected" << endl;
                
                int ret = recv(mysocket, buffer, 110000, 0);    
                buffer[ret] = '\0';
                cout << "Message = " << buffer << endl;    
                cout << "--------------------->\n";
            }
        closesocket(mysocket);


while (ret!=0){

}
виснет..
PM MAIL   Вверх
asmdzen
Дата 12.6.2011, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



**


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

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



или посылайте все в одном пакете, или поставьте в конце спец пакет который указывал бы на конец передачи, или закрывайте соединение после отправки последнего пакета (http://msdn.microsoft.com/en-us/library/ms738547%28v=vs.85%29.aspx)
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.1003 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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