Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
1

Формирование на сервере и вывод данных в веб

07.07.2011, 09:19. Показов 1248. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Приветствую Уважаемые пользователи!

Мучаюсь второй день. Я на сервере формирую информацию (Сама цель - написание trace). И после формирования укидаю ее в веб-интерфейс.

Код формирования:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
std::string somestring="", resultstr="";
int l=0;
resultstr="";
somestring="";
 
while (l<3)
             {
             switch(l){
          case 0:
              sprintf((char*)somestring.c_str(),"%2d:    %4d ms",ttl, time[0]);
              resultstr+=somestring;
          break;
          case 1:
              sprintf((char*)somestring.c_str()," %4d ms ", time[1]);
              resultstr+=somestring;
          break;
          case 2:
              sprintf((char*)somestring.c_str()," %4d ms     %i.%i.%i.%i<br><br>",
                                      time[2],rcvdIP[0],rcvdIP[1],rcvdIP[2],rcvdIP[3]);
              resultstr+=somestring;
          break;
          default:
          printf ("DEFAULT");
          }
         l++;
 }
 
    resultstr+="";
    strcpy(outBuf, resultstr.c_str());
    websWrite(wp, outBuf);
    my_socket.CloseSocket();
    websFooter(wp);
    websDone(wp, 200);
    resultstr="";
    return;

Сам trace проходит успешно, но вот инфу выводит следующую:

0 ms 192.168.15.254

br> br> br> br> br> br>


Пробовал использовать вместо while - for, пробывал также уходить от switch к if, думал мб в этом засада, но все тщетно.
Подскажите пожалуйста в чем моя ошибка или мб можно то, что я реализую через switch и string реализовать как-то иначе. Уже 8 часов за 2 дня потратил на исправление этого бага.

В свою очередь, если использовать код вида:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
std::string somestring="", resultstr="";
resultstr="";
somestring="";
 
for(int i=0; i<=2; i++)
         {
 
         switch (i)
         {
         case 0:
         {
 
                 sprintf((char*)somestring.c_str(),"%2d:    %4d ms",ttl, time[i]);
resultstr+=somestring;
 
         }break;
         case 1:
         {
 
                 sprintf((char*)somestring.c_str()," %4d ms ", time[i]);
 
         }break;
          case 2:
          {
 
                  sprintf((char*)somestring.c_str()," %4d ms     %i.%i.%i.%i<br><br>",
                          time[i],rcvdIP[0],rcvdIP[1],rcvdIP[2],rcvdIP[3]);
 
 
                  resultstr+=somestring;
 
              printf("\n%s\n",resultstr);
          }break;
         };
         }
 
    resultstr+="";
    strcpy(outBuf, resultstr.c_str());
    websWrite(wp, outBuf);
    my_socket.CloseSocket();
    websFooter(wp);
    websDone(wp, 200);
    resultstr="";
    return;
Вывод получаю в вебе следующий:

1 ms 192.168.15.254

0 ms 192.168.25.254

1 ms 195.151.213.90

3 ms 193.232.246.118

3 ms 193.232.246.118

3 ms 81.19.64.76

4 ms 81.19.64.189

3 ms 81.19.70.3


т.е. такое ощущение, как будто проге абсолютно наплевать на то, что я творю в case 1 и case 2.



Спасибо Огромное!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.07.2011, 09:19
Ответы с готовыми решениями:

Формирование данных в MFC и вывод их в Eхcel
Помогите пожалуйста! Не знаю с чего начать! Нужно в проекте формировать данные и выводить их в...

Разбор данных из файла, формирование строки и вывод на консоль
собственно, задача такова: в файле содержится данные вида: 30.10,30.5 55.5,55.7 и тд. ...

Вывод списка баз данных на сервере в ComboBox
Как сделать так чтобы при подключении к серверу выводила в comboBox список баз данных на сервере!...

Как в веб сервере Apache (ОС Linux Ubuntu) настроить логирование таким образом, чтоб при любом запросе веб-се
Помогите пожалуйста!!!Как в веб сервере Apache (ОС Linux Ubuntu) настроить логирование таким...

17
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
07.07.2011, 09:25 2
Цитата Сообщение от metoflex Посмотреть сообщение
Формирование на сервере и вывод данных в веб
Ты хочешь без апача прямо с сей что то передать в удалённый браузер?
1
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
07.07.2011, 09:31  [ТС] 3
Цитата Сообщение от taras atavin Посмотреть сообщение
Ты хочешь без апача прямо с сей что то передать в удалённый браузер?
У меня есть железячка (HDLink) с веб-интерфейсом. Мне необходимо к ее веб-интерфейсу припаять Trace (Один в один такой же, как tracert реализован в консоли у винды). Сам trace у меня написан, работает на ура и время корректно вычисляет, но вот с формированием строки для вывода в браузер.... явно какие-то непонятные проблемы. Если можете посмотрите логику того, что я написал выше. Уже до дыр просмотрел весь код... непонимаю, где может быть ошибка... Спасибо!

Добавлено через 2 минуты
Вся работа железки сваяна на vxWorks.
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
07.07.2011, 09:36 4
а вот это зачем?

C++
1
 resultstr+="";
0
4226 / 1795 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
07.07.2011, 09:38 5
А что такое trace и HDLink? Гугл говорит, что trace - это орбитальный телескоп, но врядли ты это имел ввиду.
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
07.07.2011, 09:38 6
и вот
попробуйте так.
sprintf((char*)somestring.c_str()," %d ms %i.%i.%i.%i<br><br>",
time[2],rcvdIP[0],rcvdIP[1],rcvdIP[2],rcvdIP[3]);
1
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
07.07.2011, 09:49  [ТС] 7
Цитата Сообщение от Danvern Посмотреть сообщение
а вот это зачем?

C++
1
 resultstr+="";
По-идее никакой логической нагрузки данная операция не несет. Пробывал по-разному оперировать с
resultstr, чтобы профиксить... А так данную строчку можно проделитить.

Добавлено через 2 минуты
Цитата Сообщение от taras atavin Посмотреть сообщение
А что такое trace и HDLink? Гугл говорит, что trace - это орбитальный телескоп, но врядли ты это имел ввиду.
trace - построение сетевого пути, т.е. показывает через какие сетевые точки, типа роутеры и т.п. проходит путь доставки пакетов от меня до рамбелера или любого другого сервера. Используется часто для обнаружения обрывов или неполадок на том или ином сетевом пути.

Добавлено через 24 секунды
Цитата Сообщение от Danvern Посмотреть сообщение
и вот
попробуйте так.
sprintf((char*)somestring.c_str()," %d ms %i.%i.%i.%i<br><br>",
time[2],rcvdIP[0],rcvdIP[1],rcvdIP[2],rcvdIP[3]);
ок. Сейчас попробую, но врядли это из-за такой мелочи он игнорит первые два кейса напрочь.

Добавлено через 6 минут
После поправки, что предложил Danvern прога повела себя еще более непредсказуемо.
Вывод - одна строка:

1 ms 192.168.15.254

Добавлено через 1 минуту
А HDLink - это железка, для скажем... создания собственной "мелкой" радиостанции, также широко используется в клубах на дискотеках и т.п.
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
07.07.2011, 09:56 8
можешь выложить полностью функцию или что бы хотя бы было видно объявление переменных которые ты используешь?
0
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
07.07.2011, 10:00  [ТС] 9
Сейчас скину прямо весь код ( без класса работы с сетью - он большой).

Добавлено через 47 секунд
Засада какя-то в работе со string'ами. Это точно.
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
07.07.2011, 10:01 10
попробуй без стрингов сделать?

Добавлено через 14 секунд
только массивами пульзуйся да и всё
0
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
07.07.2011, 10:04  [ТС] 11
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#include "Trace.h"
#include "TraceAsp.h"
#include <stdio.h>
#include <stdlib.h>   // Needed for _wtoi
#include <time.h>
#include <iostream>
#include <string>
#include "vxWorks.h"
#include <sysLib.h>
#include <tickLib.h>
#include <selectLib.h>
#include <sys\times.h>
 
TraceASP::TraceASP(void)
{
}
 
extern "C" ULONG tickGet(void);
 
extern "C"
{
 #include "../wsIntrn.h"
}
 
extern "C" void cgiTracert (webs_t wp, char_t *path, char_t *query)
{
 char_t *IP, *TTL;
 CTrace my_socket;
 TraceASP my_trace;
 sockaddr_in* dest_addr;
 RecvPack* pData;
 char rcvdIP[4];
 char ip[4];
 char* outBuf;
 bool* errors=false;
 int time[3]={-1,-1,-1};
 int TraceGood=0;
 int ttl=0;
 bool TraceComplete=false;
 std::string somestring="", resultstr="";
 
 IP = websGetVar(wp, T("IPAddr"), T("--unknown varible--"));
 TTL = websGetVar(wp, T("TTL"), T("--unknown varible--"));
 ttl=gatoi(TTL);
 outBuf = new  char [256];
 printf("IP=%s, TTL=%d\n", IP, ttl);
 
 my_trace.IPCreate(*errors, ip, IP);
 
 for(int i=0; i<=3; i++)
 printf("ip %d.\n", ip[i]);
 
 if (*errors==true)
 {
  printf("Invalid IP\n");
  websHeader(wp);
  websWrite(wp, T("Invalid IP address. Please enter IP address to the next type \"XXX.XXX.XXX.XXX\"."));
  websFooter(wp);
  websDone(wp, 200);
  return;
 }
 
 my_trace.SetAddr(*dest_addr, ip);
 
 if(ttl==1)
 {
   websHeader(wp);
   websWrite(wp, T("************************STARTING TRACERT************************<br><br>"));
 }
 
 if (ttl!=30)
 {
     printf("PreSwitch\n");
     int test =my_socket.SendRcvICMP(ttl, rcvdIP, time, *dest_addr);
     printf("my_socket.SendRcvICMP(ttl, rcvdIP, time, *dest_addr) = %d", test);
     switch(test)
     {
        case ICMP_OK:
        {
            printf("ICMP_OK\n");
            TraceGood=1;
        }break;
        case ICMP_TTL_TIMEOUT:
        {
            printf("ICMP_TTL_TIMEOUT\n");
            //TraceGood=-1;
            //websWrite(wp, T("Destination port unreachable<br>"));
        }break;
        case ICMP_UNREACHABLE:
        {
            printf("ICMP_UNREACHABLE\n");
            websWrite(wp, T("<br>Network unreachable for TOS<br>"));
            return;
        }break;
        case ICMP_ECHO_REPLY:
        {
            printf("ICMP_ECHO_REPLY\n");
            printf("Trace is finished\n");
            TraceComplete=true;
        }break;
     }
 
//   if(((test==ICMP_OK) || (test==ICMP_ECHO_REPLY)))
//   {
         int l=0;
         resultstr="";
         somestring="";
 
    while (l<3) {
                 switch(l)
                        {
          case 0:
              sprintf((char*)somestring.c_str(),"%2d:   %4d ms",ttl, time[0]);
              resultstr+=somestring;
          break;
          case 1:
              sprintf((char*)somestring.c_str()," %4d ms ", time[1]);
              resultstr+=somestring;
          break;
          case 2:
              sprintf((char*)somestring.c_str()," %4d ms     %i.%i.%i.%i<br><br>",
                                        time[2],rcvdIP[0],rcvdIP[1],rcvdIP[2],rcvdIP[3]);
              resultstr+=somestring;
          break;
          default:
          printf ("DEFAULT");
          }
         l++;
                    }
 
     
 
     if (TraceComplete)
     {
         websWrite(wp, T("<br>************************FINISHED TRACERT************************"));
     }
    
     strcpy(outBuf, resultstr.c_str());
     websWrite(wp, outBuf);
     my_socket.CloseSocket();
     websFooter(wp);
     websDone(wp, 200);
     resultstr="";
     return;
 }
 else
 {
     websWrite(wp, T("***Tracert is not finished, because TTL has exceeded the number 30***"));
     my_socket.CloseSocket();
     websFooter(wp);
     websDone(wp, 200);
     return;
 }
}
 
void TraceASP::SetAddr(struct sockaddr_in& dest_addr, char* ip)
{
     memset(&dest_addr,0,sizeof(dest_addr));
 
     dest_addr.sin_family = AF_INET;
     dest_addr.sin_port = 0;
     dest_addr.sin_addr.s_addr=*(u_int32_t*)ip;
     return;
}
 
void TraceASP::IPCreate(bool& errors, char* ip, char *IP)  // Check IP has errors
{
    int ipnum=0, ipnumber=0, check=0, numip=0;
    std::string ipstring, onenumber="", point=".", ipfinish="";
 
    for(int i=0; i<=3; i++)
     {
        ip[i]=NULL;
     }
     ipstring=(std::string)IP;
 
     while(true)
     {
         if(((ipstring[ipnum]==point[0])||((ipnumber==0)&&((ipstring[ipnum]>=48)&&(ipstring[ipnum]<=57)))))
         {
           if (!(ipnum==0)) ipnum++;
           do
           {
            if((!((ipstring[ipnum]>=48)&&(ipstring[ipnum]<=57))))
            {
             if(((ipnumber==3) && (ipstring[ipnum])==ipstring[ipstring.length()-1])) break;
             else errors=true;
            }
            check++;
            onenumber+=ipstring[ipnum];
            ipnum++;
           }while(((ipnum<ipstring.length())&&(!(ipstring[ipnum]==point[0]))));
 
           if(check>=4) errors=true;
           else check=0;
           numip=gatoi(onenumber.c_str());
           ip[ipnumber]=(char)numip;
           onenumber="";
           ipnumber++;
 
           if((ipnumber>=5)||((ipnumber<4)&&(ipnum>=ipstring.length())))
           {
               errors=true;
           }
           else if(((ipnumber==4)&&(!(ip[3]==NULL))))
           {
            if(ipstring[ipnum]==ipstring[ipstring.length()]) break;
            else errors=true;
           }
          }
          else errors=true;
     }
}
 
TraceASP::~TraceASP(void)
{
}
0
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
07.07.2011, 10:06  [ТС] 12
Цитата Сообщение от Danvern Посмотреть сообщение
попробуй без стрингов сделать?

Добавлено через 14 секунд
только массивами пульзуйся да и всё
С массивами много лишних действий, а нужно сделать все локанично, ибо не для себя ваяю.
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
07.07.2011, 10:07 13
char rcvdIP[4]; почему тут написано что rcvdIP это char
f nen
sprintf((char*)somestring.c_str()," %4d ms %i.%i.%i.%i<br><br>",
time[2],rcvdIP[0],rcvdIP[1],rcvdIP[2],rcvdIP[3]);
а тут вы описываете что это int?
0
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
07.07.2011, 10:26  [ТС] 14
Цитата Сообщение от Danvern Посмотреть сообщение
char rcvdIP[4]; почему тут написано что rcvdIP это char
f nen
sprintf((char*)somestring.c_str()," %4d ms %i.%i.%i.%i<br><br>",
time[2],rcvdIP[0],rcvdIP[1],rcvdIP[2],rcvdIP[3]);
а тут вы описываете что это int?
Я числовые значения вывожу. Он автоматом производит преобразование типа.

Добавлено через 12 минут
Решение нашел:

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
for(int i=0; i<=2; i++)
     {
         switch (i)
         {
         case 0:
         {
             sprintf(outBuf,"%d:    %d ms",ttl, time[i]);
             websWrite(wp, outBuf);
         }break;
         case 1:
         {
             sprintf(outBuf,"   %d ms", time[i]);
             websWrite(wp, outBuf);
 
         }break;
         case 2:
         {
             sprintf(outBuf," %d ms %i.%i.%i.%i<br>",
              time[2],rcvdIP[0],rcvdIP[1],rcvdIP[2],rcvdIP[3]);
             websWrite(wp, outBuf);
             free(outBuf);
         }break;
         };
}
Но не красивое, если кто-то сможет подсказать, что-то более иили менее адекватное, чем я сваял, буду весьма благодарен.
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
07.07.2011, 11:09 15
немного пошарился по google и там на одной из ссылки было написано что sprintf только для char
а для стринг
вот такой примерчик.
std::ostringstream os;
os << "Hello test " << someint << ' ' << somestring;
std::string buffer(os.str());
1
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
07.07.2011, 11:12  [ТС] 16
Цитата Сообщение от Danvern Посмотреть сообщение
немного пошарился по google и там на одной из ссылки было написано что sprintf только для char
а для стринг
вот такой примерчик.
std::ostringstream os;
os << "Hello test " << someint << ' ' << somestring;
std::string buffer(os.str());

Это я знаю, именно поэтому я и прописывал:

sprintf((char*)strint.c_str(), "%i", int_value);
0
41 / 40 / 5
Регистрация: 22.06.2010
Сообщений: 415
Записей в блоге: 1
07.07.2011, 11:15 17
а вот так то пробовали?
а че то ни где не увидел?!?!
std::ostringstream os;
os << "Hello test " << someint << ' ' << somestring;
std::string buffer(os.str());
0
4 / 4 / 1
Регистрация: 18.04.2010
Сообщений: 82
07.07.2011, 11:18  [ТС] 18
Цитата Сообщение от Danvern Посмотреть сообщение
а вот так то пробовали?
а че то ни где не увидел?!?!
std::ostringstream os;
os << "Hello test " << someint << ' ' << somestring;
std::string buffer(os.str());
Именно это не пробовал, но как вариант поюзать можно будет. Сегодня, если под конец рабочего дня время останется испробую.

Спасибо!
0
07.07.2011, 11:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.07.2011, 11:18
Помогаю со студенческими работами здесь

Вывод списка баз данных, что присутствуют на сервере
У меня задача вывести на экран список баз данных что присутствуют на сервере в данный момент...

Вывод данных из БД на веб страницу
Привет всем!Вот у меня возникла проблемка.Я создал форму которая передает данные после ввода всех...

Вывод данных из БД на Веб-форму
Помогите, пожалуйста, начинающему веб-разработчику... Проект Веб-приложение ASP.NET (.NET...

Вывод данных MS Access в веб интерфейс
Задача такая, что нужно предоставить доступ из вне (через сайт) к данным MS Access. Подскажите пути...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru