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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с парочкой пустячков, Не могу разобраться с типами... 
:(
    Опции темы
Romashkaz
  Дата 20.11.2008, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вообщем пишу дллку на С++, а интерфейс весь на делфи, вообще выложу кое какие куски кода и напишу в чём не могу разобраться...

bool    __stdcall    rtcOCSLogin( wchar_t* serverIP,    wchar_t* userAccount,    wchar_t* userPassword )

// serverIP, userAccount, userPassword получаю из Делфи и нужно вставить их в кое-какие места...

strcpy(szMessage, "CommandID=[0];LineDevID=[14];CallID=[];Param1=[jan];Param2=[53];");
    strcpy(szServerName, "192.168.2.4");

userAccount в Param1=[сюды]
userPassword в Param2[сюды]
serverIP вместо айпишника...


+ я отсылаю  строку ( CommandID=[0];LineDevID=[14];CallID=[];Param1=[jan];Param2=[53]; ) кое-какому серверу и мне он отсылает её обратно, только с правильными Param1=[логин] и Param2=[пароль]... Как мне вытащить логин и пароль из параметров, из принятой строки?

С++ только с недавнего времени изучаю, поэтому прошу отнестись с пониманием и помочь! Заранее МЕГА-Спасибо!

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


трололомен
****


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

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



и как понимать сие творение?
PM MAIL   Вверх
Romashkaz
Дата 20.11.2008, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



mrbrooks, а что именно непонятно?  smile 
PM MAIL   Вверх
Rififi
Дата 20.11.2008, 12:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



тебе нужно найти в строке подстроку (strstr) "Param1=[" или "Param2=[" и вытащить все символы до ']'
PM MAIL   Вверх
Romashkaz
Дата 20.11.2008, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Rififi, ну я впринципе так и догадывался! Только какой функцией? Или если можно какой-нибудь пример! буду очень благодарен! И кстате не подскажете как быть с первым вопросом?
PM MAIL   Вверх
bsa
Дата 20.11.2008, 12:35 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Romashkaz, напиши пример, что отсылается серверу, что приходит от сервера, и что оттуда надо вытащить.
я так понял, нужно из вытащить выделенные данные: CommandID=[0];LineDevID=[14];CallID=[];Param1=[jan];Param2=[53];
Код
std::string paramFromText(const std::string &text, const std::string &name)
{
    std::string::size_type p = text.find(name);
    p = text.find(p, "[");
    if (p != std::string::npos) {
       ++p;
       return text.substr(p, text.find(p, "]") - p);
    }
    return std::string(); //параметр не найден
}

void myFunc()
{
   std::string text = "CommandID=[0];LineDevID=[14];CallID=[];Param1=[jan];Param2=[53]";
   std::string login = paramFromText(text, "Param1");
   std::string password = paramFromText(text, "Param2");
}



Это сообщение отредактировал(а) bsa - 20.11.2008, 12:35
PM   Вверх
Romashkaz
Дата 20.11.2008, 12:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



bsa,  спасибо большое! Вечером попробую... А не подскажешь как с 1 вопросом будет? Там насколько я понимаю нужно сменить тип, чтобы подставить всё как надо... Ковырялся пару дней так и не получилось... Использовал функцию wcstombs...
PM MAIL   Вверх
bsa
Дата 20.11.2008, 14:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

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



Romashkaz, вообще-то я дал ответ на 1-й вопрос, который ты задал в первом сообщении.
PM   Вверх
xvr
Дата 20.11.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Код

bool    __stdcall    rtcOCSLogin( wchar_t* serverIP,    wchar_t* userAccount,    wchar_t* userPassword )
{
...

 sprintf(szMessage, "CommandID=[0];LineDevID=[14];CallID=[];Param1=[%S];Param2=[%S];", userAccount,userPassword);
 sprintf(szServerName, "%S",serverIP);
...
}


PM MAIL   Вверх
Romashkaz
Дата 20.11.2008, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем огромное спасибо! Буду тренироваться :P
PM MAIL   Вверх
Romashkaz
Дата 20.11.2008, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Так, есть ещё один вопрос....

Вообще вот весь код...
Код


bool    __stdcall    rtcOCSLogin( wchar_t* serverIP,    wchar_t* userAccount,    wchar_t* userPassword, wchar_t* serverPort )
{
    //    Asterisk
//    IP: 159.148.46.28
//    Port: 5038
//
//    CM
//    IP: 192.168.2.16
//    Port: 20057


        SOCKET        sClient;
    char          szBuffer[1024];
    int           ret, i;
    struct sockaddr_in server;
    struct hostent    *host = NULL;
    char  szServerName[1024], szMessage[1024], szServerPort[1024];

    sprintf(szMessage, "CommandID=[0];LineDevID=[14];CallID=[];Param1=[%S];Param2=[%S];", userAccount,userPassword);
    sprintf(szServerName, "%S",serverIP);
    sprintf(szServerPort, "%S", serverPort);
    
    sClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (sClient == INVALID_SOCKET)
    {
        logWrite(L"Can't create socket", LOG_ERROR_MESSAGE);
        return 1;
    }
    server.sin_family = AF_INET;
    server.sin_port = htons(szServerPort);
    server.sin_addr.s_addr = inet_addr(szServerName);

    if (server.sin_addr.s_addr == INADDR_NONE)
    {
        host = gethostbyname(szServerName);
        if (host == NULL)
        {
            logWrite(L"Unable to resolve server", LOG_ERROR_MESSAGE);
            return 1;
        }
        CopyMemory(&server.sin_addr, host->h_addr_list[0],
            host->h_length);
    }
    if (connect(sClient, (struct sockaddr *)&server, 
        sizeof(server)) == SOCKET_ERROR)
    {
        logWrite(L"connect failed", LOG_ERROR_MESSAGE);
        return 1;
    }

    // Send and receive data 
    ret = send(sClient, szMessage, strlen(szMessage), 0);
    if (ret == SOCKET_ERROR)
    {
        logWrite(L"send failed", LOG_ERROR_MESSAGE);
    }

    Sleep(1000);

    char          szRecvBuff[1024];
    ret = recv(sClient, szRecvBuff, 1024, 0);
    if (ret == SOCKET_ERROR)
    {
        logWrite(L"recv failed", LOG_ERROR_MESSAGE);
    }
    logWrite(L"Recived data", LOG_INFO_MESSAGE);
    if (ret == true)
    {    logWrite(L"Data received!", LOG_INFO_MESSAGE); }
    closesocket(sClient);
}


Вообщем, если подставляю szServerPort в htons, то выдает вот такую ошибку - j:\11.11.08 - сделал сокеты на с++\simple rtc\simple rtc\rtc\rtc.exports.cpp(208) : error C2664: 'htons' : cannot convert parameter 1 from 'char [1024]' to 'u_short' ...

Как с этим бороться?

З.Ы. и правильно ли выставлет тип szServerName и szMessage ? А то походу выдает ошибку в названии сервера... Вообщем срабатывает данная функция :

  if (connect(sClient, (struct sockaddr *)&server, 
        sizeof(server)) == SOCKET_ERROR)
    {
        logWrite(L"connect failed", LOG_ERROR_MESSAGE);
        return 1;
    }

Тоесть выводит, что коннект файлд...
PM MAIL   Вверх
xvr
Дата 20.11.2008, 20:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Romashkaz @ 20.11.2008,  19:15)
Так, есть ещё один вопрос....

Общий ответ - почитать букварь по socket

Цитата

Вообщем, если подставляю szServerPort в htons, то выдает вот такую ошибку - j:\11.11.08 - сделал сокеты на с++\simple rtc\simple rtc\rtc\rtc.exports.cpp(208) : error C2664: 'htons' : cannot convert parameter 1 from 'char [1024]' to 'u_short' ...
Правильно говорит - htons принимает порт в виде числа, а не строки
Цитата

Как с этим бороться?
Передать число, например так htons(atoi(szServerPort))

Цитата

З.Ы. и правильно ли выставлет тип szServerName и szMessage ? 
Тип чего?

Цитата

А то походу выдает ошибку в названии сервера...
 Вообщем срабатывает данная функция :

  if (connect(sClient, (struct sockaddr *)&server, 
        sizeof(server)) == SOCKET_ERROR)
    {
        logWrite(L"connect failed", LOG_ERROR_MESSAGE);
        return 1;
    }

Тоесть выводит, что коннект файлд...
А что говорит WSAGetLastError?

PM MAIL   Вверх
Romashkaz
Дата 20.11.2008, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



xvr, не пользовался никогда WSAGetLastError поэтому и не знаю с чем её едят... А вот насчёт szMessage и szServerName... Хочу поинтересоваться правильно ли я выбрал тип? Тоесть чтоб код, тоесть szServerName ( айпи ) был читабелен для программы, когда я его подставляю в нужное место...

Это сообщение отредактировал(а) Romashkaz - 20.11.2008, 20:42
PM MAIL   Вверх
xvr
Дата 20.11.2008, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

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



Цитата(Romashkaz @ 20.11.2008,  20:39)
xvr, не пользовался никогда WSAGetLastError поэтому и не знаю с чем её едят... 

С тем же, чем и остальные функции, возвращающие код ошибки. Ее надо просто позвать и распечатать число, которое она вернет. Иначе это все гадание на кофейной гуще - почему connect не сработал.

Цитата

А вот насчёт szMessage и szServerName... Хочу поинтересоваться правильно ли я выбрал тип? Тоесть чтоб код, тоесть szServerName ( айпи ) был читабелен для программы, когда я его подставляю в нужное место...
Тип правильный
PM MAIL   Вверх
Romashkaz
Дата 20.11.2008, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



xvr, 

такс, не могу разобраться с WSAGetLastError, можно мне как особо одаренному пример для моей программки? Дело в том, что я ещё пишу дллку и сообщение я могу увидеть только с помощью функции logWrite(сообщение, информация о сообщении)

Пример - logWrite(L"message", LOG_INFO_MESSAGE) или logWrite(serverIP, LOG_INFO_MESSAGE) ... но дело в том, что как я понял что WSAGetLastError выдает номер ошибки, следовательно у неё тип int, а насколько я понял, вывести я могу только wchar_t* ...

Заранее извиняюсь за сырость моих знаний, а скорее всего даже их отсутствия... Но хочу научиться! Учусь сразу на практики... Знаю несколько других языков программирования, но С++ - это что другое, более гибкое, сложное и интересоное! Спасибо smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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