Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > преобразовать массив int в string


Автор: iPlay 11.6.2011, 09:24
Народ, подскажите как преобразовать массив 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);

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

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

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

Автор: iPlay 11.6.2011, 09:51
Только если отправлять просто переменные появляется надпись при компиляции smile)

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

+ стоит учесть что это winsock smile

Автор: boostcoder 11.6.2011, 09:53
ответа на свой вопрос так и не получил.
вот два варианта. выбирайте сами.
Код

#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/6007ce272d3e85006f8f4eadb9e02122

Автор: iPlay 12.6.2011, 08:33
С предыдущим разобрался , не пойму теперь почему сервер принимает только одну строку и всё, хотя я в клиенте в цикле отправляю 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);

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

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

Автор: iPlay 12.6.2011, 12:34
А как узнать что соединение было закрыто?

Автор: asmdzen 12.6.2011, 14:47
recv вернет 0

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

 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){

}
виснет..

Автор: asmdzen 12.6.2011, 16:19
или посылайте все в одном пакете, или поставьте в конце спец пакет который указывал бы на конец передачи, или закрывайте соединение после отправки последнего пакета (http://msdn.microsoft.com/en-us/library/ms738547%28v=vs.85%29.aspx)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)