DlgStatistics.cpp
上传用户:gnaf34
上传日期:2022-04-22
资源大小:1657k
文件大小:25k
源码类别:

IP电话/视频会议

开发平台:

Visual C++

  1. /*
  2.  * DlgStatistics.cxx
  3.  *
  4.  * Implementation file
  5.  *
  6.  * Copyright (c) ITEC-Ohio, 2002.
  7.  *
  8.  * The contents of this file are subject to the Mozilla Public License
  9.  * Version 1.0 (the "License"); you may not use this file except in
  10.  * compliance with the License. You may obtain a copy of the License at
  11.  * http://www.mozilla.org/MPL/
  12.  *
  13.  * Software distributed under the License is distributed on an "AS IS"
  14.  * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
  15.  * the License for the specific language governing rights and limitations
  16.  * under the License.
  17.  *
  18.  * The Original Code is Open H323 Library available at http://www.openh323.org
  19.  * The Initial Developer of the Original Code is Equivalence Pty. Ltd.
  20.  *
  21.  */
  22. #include "stdafx.h"
  23. #include <iostream.h>
  24. #include <fstream.h>
  25. #include <ptlib.h>
  26. #include <string.h>
  27. //#include <winsock.h>
  28. #include "main.h"
  29. #include "ping.h"
  30. #include "BeaconClient.h"
  31. #include "DlgStatistics.h"
  32. #include <time.h>
  33. #ifdef _DEBUG
  34. #define new DEBUG_NEW
  35. #undef THIS_FILE
  36. static char THIS_FILE[] = __FILE__;
  37. #endif
  38. /////////////////////////////////////////////////////////////////////////////
  39. // CDlgStatistics dialog
  40. extern BeaconClient* globalInstance;
  41. extern const char* globalEndReason;
  42. extern int FlagEndPoint;
  43. extern char CurrentDrive_tmp1[MAX_PATH];
  44. extern char tmpCurrDrvStr[MAX_PATH];
  45. extern CString consoleStr;
  46. //For Statistics Part
  47. extern int StartTimeGlobalYear;
  48. extern int StartTimeGlobalMonth;
  49. extern int StartTimeGlobalDay;
  50. extern int StartTimeGlobalHour;
  51. extern int  StartTimeGlobalMinute;
  52. extern int StartTimeGlobalSecond;
  53. extern DWORD RoundTripTimeDelayGlobal;
  54. extern PStringStream DurationTimeGlobal;
  55. extern DWORD AudioFrameRateGlobal;
  56. extern DWORD PacketSentGlobal;
  57. extern DWORD OctetSendGlobal;
  58. extern DWORD MaximumSendTimeGlobal;
  59. extern DWORD AverageSendTimeGlobal;
  60. extern DWORD MinimumSendTimeGlobal;
  61. extern DWORD PacketsReceivedGlobal;
  62. extern DWORD OctetsReceivedGlobal;
  63. extern DWORD MaximumReceiveTimeGlobal;
  64. extern DWORD AverageReceiveTimeGlobal;
  65. extern DWORD MinimumReceiveTimeGlobal;
  66. extern DWORD PacketsLostGlobal;
  67. extern DWORD PacketsOutOfOrderGlobal;
  68. extern DWORD PacketsOutTooLateGlobal;
  69. extern DWORD JitterTimeGlobal;
  70. extern PString PayloadTypeGlobal;
  71. extern PString ReceivedDTMFMessages;
  72. PString TmpReceivedDTMFMessages;
  73. UINT StatisticTimer;
  74. extern UINT ConnectionTimer;
  75. extern int is_MsgBox_Display; // 0 means globalendReason has NOT been displayed, 
  76. extern bool bCalling;
  77. extern CString ipglobal;
  78. int   prevpingresult = 0;
  79. int   pingresult;
  80. hostent *host1 = NULL;
  81. char hostname[80];
  82. CString localmachine;
  83. int PacketSentStat = 0;
  84. int DurationHour;
  85. int DurationMinute;
  86. int DurationSecond;
  87. CString sessionStartTime;
  88. CString sessionEndTime;
  89. CString sessionDate;
  90. //Ping Report Variables
  91. CString avgPingLatency;
  92. CString medianPingLatency;
  93. CString sdPingLatency;
  94. CString minPingLatency;
  95. CString maxPingLatency;
  96. CString P50PingLatency;
  97. CString P90PingLatency;
  98. //Codec Latency Report Variables
  99. CString avgCodecLatency;
  100. CString medianCodecLatency;
  101. CString sdCodecLatency;
  102. CString minCodecLatency;
  103. CString maxCodecLatency;
  104. CString P50CodecLatency;
  105. CString P90CodecLatency;
  106. //Jitter Report Variables
  107. CString avgJitterLatency;
  108. CString medianJitterLatency;
  109. CString sdJitterLatency;
  110. CString minJitterLatency;
  111. CString maxJitterLatency;
  112. CString P50JitterLatency;
  113. CString P90JitterLatency;
  114. //PacketLoss Report Variables
  115. CString avgPacketLossLatency;
  116. CString medianPacketLossLatency;
  117. CString sdPacketLossLatency;
  118. CString minPacketLossLatency;
  119. CString maxPacketLossLatency;
  120. CString P50PacketLossLatency;
  121. CString P90PacketLossLatency;
  122. extern CString ReportStr;
  123. //Initialize GNUPlot markers to define good/acceptable/unacceptable for statistics
  124. // Packet Lost
  125. const char *pktlost_good = "0.0";
  126. const char *pktlost_acceptable = "0.5";
  127. const char *pktlost_unacceptable = "1.5";
  128. // Round Trip Time / Latency
  129. const char *rtd_good = "0";
  130. const char *rtd_acceptable = "200";
  131. const char *rtd_unacceptable = "400";
  132. // Audio Jitter
  133. //This information is got from ITU G.114 as stated in
  134. //Wainhouse Research Whitepaper available at-
  135. //http://www.wainhouse.com/files/papers/wr-qos-in-ip-networks.pdf
  136. //Defaults for Audio Jitter:
  137. //audjitter_good = "0";
  138. //audjitter_acceptable = "20";
  139. //audjitter_unacceptable = "50";
  140. const char *audjitter_good = "0";
  141. const char *audjitter_acceptable = "20";
  142. const char *audjitter_unacceptable = "50";
  143. CDlgStatistics::CDlgStatistics(CWnd* pParent /*=NULL*/)
  144. : CDialog(CDlgStatistics::IDD, pParent)
  145. {
  146. //{{AFX_DATA_INIT(CDlgStatistics)
  147. // NOTE: the ClassWizard will add member initialization here
  148. //}}AFX_DATA_INIT}
  149. gethostname(hostname, sizeof(hostname));
  150. host1 = gethostbyname(hostname);
  151. localmachine = inet_ntoa(*(reinterpret_cast<in_addr*>(host1->h_addr)));
  152. }
  153. void CDlgStatistics::DoDataExchange(CDataExchange* pDX)
  154. {
  155. CDialog::DoDataExchange(pDX);
  156. //{{AFX_DATA_MAP(CDlgStatistics)
  157. // NOTE: the ClassWizard will add DDX and DDV calls here
  158. //}}AFX_DATA_MAP
  159. }
  160. BEGIN_MESSAGE_MAP(CDlgStatistics, CDialog)
  161. //{{AFX_MSG_MAP(CDlgStatistics)
  162. ON_BN_CLICKED(IDC_BUTTON_START, OnButtonStart)
  163. ON_WM_PAINT()
  164. ON_WM_TIMER()
  165. ON_WM_CREATE()
  166. ON_WM_CANCELMODE()
  167. ON_WM_CAPTURECHANGED()
  168. //}}AFX_MSG_MAP
  169. END_MESSAGE_MAP()
  170. /////////////////////////////////////////////////////////////////////////////
  171. // CDlgStatistics message handlers
  172. //BeaconClient *instance;
  173. void CDlgStatistics::OnButtonStart() 
  174. {
  175. }
  176. void CDlgStatistics::OnPaint() 
  177. {
  178. TRY {
  179. CPaintDC dc(this); // device context for painting
  180. // For statistic part, we are using WM_TIMER to collect
  181. // statistic for every second by command SetTimer(1,1000,0) 
  182. // where 1000 = 1000 mile second
  183. CDlgStatistics::KillTimer(StatisticTimer);
  184. if (globalInstance != NULL){
  185. if (globalInstance->endpoint != NULL){
  186. StatisticTimer = CDlgStatistics::SetTimer(20,1000,0);
  187. }
  188. else{
  189. CDlgStatistics::KillTimer(StatisticTimer);
  190. }
  191. }
  192. // Do not call CDialog::OnPaint() for painting messages
  193. } // End TRY
  194. CATCH_ALL(e){
  195. // Put some delay here
  196. }
  197. END_CATCH_ALL
  198.   
  199. }
  200. void CDlgStatistics::OnTimer(UINT nIDEvent) 
  201. {
  202. // TODO: Add your message handler code here and/or call default
  203. // Collect statistic for every second (Using WM_TIMER)
  204. // Display it to window
  205. char buffer[200];
  206. CString strtext;
  207. CString strhour;
  208. CString strminute;
  209. CString strsecond;
  210. CString StartTime;
  211. CString CurrentTimeStat;
  212. CString PayloadTypeName;
  213. CString strCurrentYear;
  214. CString strCurrentMonth;
  215. CString strCurrentDay;
  216. CString strCurrentHour;
  217. CString strCurrentMinute;
  218. CString strCurrentSecond;
  219. int CurrentHour;
  220. int CurrentMinute;
  221. int CurrentSecond;
  222. int CurrentYear;
  223. int CurrentMonth;
  224. int CurrentDay;
  225. CString strCurrentMonth_tmp;
  226. CString tmpStrVar;
  227. CString CurrentDateTimeStat;
  228. CString str;
  229. int stat;
  230. TRY {
  231. CTime time = CTime::GetCurrentTime();
  232. CEdit *p_FrameRate = (CEdit *)GetDlgItem(IDC_EDIT_FrameRate);
  233. CEdit *p_PacketSent = (CEdit *)GetDlgItem(IDC_EDIT_PACKET_SENT);
  234. CEdit *p_OctetSend = (CEdit *)GetDlgItem(IDC_EDIT_OCTET_SENT);
  235. CEdit *p_MaxSendTime = (CEdit *)GetDlgItem(IDC_EDIT_MAXIMUM_SENDTIME);
  236. CEdit *p_AvSendTime = (CEdit *)GetDlgItem(IDC_EDIT_AVERAGE_SENDTIME);
  237. CEdit *p_MinSendTime = (CEdit *)GetDlgItem(IDC_EDIT_MINIMUM_SENDTIME);
  238. CEdit *p_PacketReceived = (CEdit *)GetDlgItem(IDC_EDIT_PACKET_RECEIVED);
  239. CEdit *p_OctetReceived = (CEdit *)GetDlgItem(IDC_EDIT_OCTET_RECEIVED);
  240. CEdit *p_MaxRecTime = (CEdit *)GetDlgItem(IDC_EDIT_MAXIMUM_RECEIVETIME);
  241. CEdit *p_AvRecTime = (CEdit *)GetDlgItem(IDC_EDIT_AVERAGE_RECEIVETIME);
  242. CEdit *p_MinRecTime = (CEdit *)GetDlgItem(IDC_MINIMUM_RECEIVETIME);
  243. CEdit *p_PacketLoss = (CEdit *)GetDlgItem(IDC_EDIT_PL);
  244. CEdit *p_PacketOutOfOrder = (CEdit *)GetDlgItem(IDC_Packet_Out_Of_Order2);
  245. CEdit *p_PacketTooLate = (CEdit *)GetDlgItem(IDC_Packet_Too_Late2);
  246. CEdit *p_AudioJitter = (CEdit *)GetDlgItem(IDC_EDIT_AJ);
  247. CEdit *p_StartTime = (CEdit *)GetDlgItem(IDC_StartTime1);
  248. CEdit *p_RoundTripDelay = (CEdit *)GetDlgItem(IDC_RoundTripTime);
  249. // Server IP
  250. CEdit *p_ServerIP = (CEdit *)GetDlgItem(IDC_SERVER_IP);
  251. //Client IP
  252. CEdit *p_ClientIP = (CEdit *)GetDlgItem(IDC_CLIENT_IP);
  253. CEdit *p_PayloadType = (CEdit *)GetDlgItem(IDC_PayloadType);
  254. // Open All necessary files to capture all statistic in real time
  255. // Fields to be captured:
  256. // Date and Time Stamp
  257. // Frame Rate
  258. // Packet Sent
  259. // Octet Sent
  260. // Maximum Send Time
  261. // Average Send Time
  262. // Minimum Send Time
  263. // Packet Received
  264. // Octet Received
  265. // Maximum Receive Time
  266. // Average Receive Time
  267. // Minimum Receive Time
  268. // Packet Loss
  269. // Packet Out Of Order
  270. // Packet Too Late
  271. // Audio Jitter
  272. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"timestamp.txt");
  273. fstream fs1(  tmpCurrDrvStr, ios::out | ios::app ); // Date and Time Stamp
  274. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"ploadtype.txt");
  275. fstream fs2(  tmpCurrDrvStr, ios::out | ios::app ); // Payload Type
  276. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"pktloss.txt");
  277. fstream fs3(  tmpCurrDrvStr, ios::out | ios::app ); // Packet Loss
  278. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"audjitter.txt");
  279. fstream fs4(  tmpCurrDrvStr, ios::out | ios::app ); // Audio Jitter
  280. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"rtd.txt");
  281. fstream fs5(  tmpCurrDrvStr, ios::out | ios::app ); // Round Trip Delay
  282. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"pktsent.txt");
  283. fstream fs6( tmpCurrDrvStr, ios::out | ios::app ); // Packet Sent
  284. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"octsent.txt");
  285. fstream fs7( tmpCurrDrvStr, ios::out | ios::app ); // Octet Sent
  286. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"pktrecvd.txt");
  287. fstream fs8(  tmpCurrDrvStr, ios::out | ios::app ); // Packet Received
  288. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"octrecvd.txt");
  289. fstream fs9(  tmpCurrDrvStr, ios::out | ios::app  ); // Octet Received
  290. //GNUPlot related files
  291. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"pktloss_gplot.txt");
  292. fstream fs3gplot(  tmpCurrDrvStr, ios::out | ios::app ); // Packet Loss_gnuplot
  293. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"audjitter_gplot.txt");
  294. fstream fs4gplot(  tmpCurrDrvStr, ios::out | ios::app ); // Audio Jitter_gnuplot
  295. sprintf(tmpCurrDrvStr,"%s\\%s",CurrentDrive_tmp1,"rtd_gplot.txt");
  296. fstream fs5gplot(  tmpCurrDrvStr, ios::out | ios::app ); // Round Trip Delay_gnuplot
  297.  
  298. if (globalInstance->endpoint != NULL){
  299. stat = globalInstance->GetStatistics();
  300. if (stat == 0){
  301. SetDlgItemText(IDC_EDIT_CALLSTATUS, "In Session");
  302. CTime  start_time = CTime(StartTimeGlobalYear,StartTimeGlobalMonth,StartTimeGlobalDay,StartTimeGlobalHour,StartTimeGlobalMinute,StartTimeGlobalSecond);
  303. CTimeSpan dur = time - start_time;
  304. DurationHour = dur.GetTotalHours();
  305. DurationMinute = dur.GetMinutes();
  306. DurationSecond = dur.GetSeconds();
  307. CurrentHour = time.GetHour();
  308. CurrentMinute = time.GetMinute();
  309. CurrentSecond = time.GetSecond();
  310. CurrentYear = time.GetYear();
  311. CurrentMonth = time.GetMonth();
  312. CurrentDay = time.GetDay();
  313. // Implement Time Difference because we want to
  314. // Map difference between PTime and CTime
  315. // Get Duration
  316. strhour = _itoa(DurationHour,buffer,10);
  317. strminute = _itoa(DurationMinute,buffer,10);
  318. strsecond = _itoa(DurationSecond,buffer,10);
  319. strCurrentHour = _itoa(CurrentHour,buffer,10);
  320. strCurrentMinute = _itoa(CurrentMinute,buffer,10);
  321. strCurrentSecond = _itoa(CurrentSecond,buffer,10);
  322. strCurrentYear = _itoa(CurrentYear,buffer,10);
  323. strCurrentMonth = time.Format("%B");      // _itoa(CurrentMonth,buffer,10);
  324. strCurrentDay = _itoa(CurrentDay,buffer,10);
  325. strCurrentMonth_tmp = _itoa(CurrentMonth,buffer,10);
  326. StartTime = strhour + ":" + strminute + ":" + strsecond; // Duration Time
  327. CurrentTimeStat = strCurrentHour + ":" + strCurrentMinute + ":" + strCurrentSecond;
  328. CurrentDateTimeStat = strCurrentYear + "-"+ strCurrentMonth_tmp 
  329. + "-" + strCurrentDay + "_" + CurrentTimeStat;
  330. // End of Duration
  331. //Calculation of session start time and session end time
  332. sessionEndTime = CurrentTimeStat;
  333. sessionStartTime = (CString)_itoa(CurrentHour-DurationHour,buffer,10)+":"+ (CString)_itoa(CurrentMinute-DurationMinute,buffer,10)+":"+ (CString)_itoa(CurrentSecond-DurationSecond,buffer,10);
  334. sessionDate = strCurrentMonth_tmp + "/" + strCurrentDay + "/" + strCurrentYear;
  335. // Payload Type
  336. /*
  337.   PCMU,         // G.711 u-Law
  338.   FS1016,       // Federal Standard 1016 CELP
  339.   G721,         // ADPCM - Subsumed by G.726
  340.   G726 = G721,
  341.   GSM,          // GSM 06.10
  342.   G7231,        // G.723.1 at 6.3kbps or 5.3 kbps
  343.   DVI4_8k,      // DVI4 at 8kHz sample rate
  344.   DVI4_16k,     // DVI4 at 16kHz sample rate
  345.   LPC,          // LPC-10 Linear Predictive CELP
  346.   PCMA,         // G.711 A-Law
  347.   G722,         // G.722
  348.   L16_Stereo,   // 16 bit linear PCM
  349.   L16_Mono,     // 16 bit linear PCM
  350.   G723,         // G.723
  351.   CN,           // Confort Noise
  352.   MPA,          // MPEG1 or MPEG2 audio
  353.   G728,         // G.728 16kbps CELP
  354.   DVI4_11k,     // DVI4 at 11kHz sample rate
  355.   DVI4_22k,     // DVI4 at 22kHz sample rate
  356.   G729,         // G.729 8kbps
  357.   Cisco_CN,     // Cisco systems comfort noise (unofficial)
  358.   CelB = 25,    // Sun Systems Cell-B video
  359.   JPEG,         // Motion JPEG
  360.   H261 = 31,    // H.261
  361.   MPV,          // MPEG1 or MPEG2 video
  362.   MP2T,         // MPEG2 transport system
  363.   H263,         // H.263
  364. */
  365. switch (atoi(PayloadTypeGlobal)){
  366. case 0: PayloadTypeName = "G.711 u-Law";
  367. break;
  368. case 1: PayloadTypeName = "Federal Standard 1016 CELP";
  369. break;
  370. case 2: PayloadTypeName = "ADPCM - Subsumed by G.726";
  371. break;
  372. case 3: PayloadTypeName = "GSM 06.10";
  373. break;
  374. case 4: PayloadTypeName = "G.723.1 at 6.3kbps or 5.3 kbps";
  375. break;
  376. case 5: PayloadTypeName = "GDVI4 at 8kHz sample rate";
  377. break;
  378. case 6: PayloadTypeName = "DVI4 at 16kHz sample rate";
  379. break;
  380. case 7: PayloadTypeName = "LPC-10 Linear Predictive CELP";
  381. break;
  382. case 8: PayloadTypeName = "G.711 A-Law";
  383. break;
  384. case 9: PayloadTypeName = "G.722";
  385. break;
  386. case 10:PayloadTypeName = "16 bit linear PCM";
  387. break;
  388. case 11:PayloadTypeName = "16 bit linear PCM";
  389. break;
  390. case 12:PayloadTypeName = "G.723";
  391. break;
  392. case 13:PayloadTypeName = "Confort Noise";
  393. break;
  394. case 14:PayloadTypeName = "MPEG1 or MPEG2 audio";
  395. break;
  396. case 15:PayloadTypeName = "G.728 16kbps CELP";
  397. break;
  398. case 16:PayloadTypeName = "DVI4 at 11kHz sample rate";
  399. break;
  400. case 17:PayloadTypeName = "DVI4 at 22kHz sample rate";
  401. break;
  402. case 18:PayloadTypeName = "G.729 8kbps";
  403. break;
  404. case 19:PayloadTypeName = "Cisco systems comfort noise (unofficial)";
  405. break;
  406. case 20:PayloadTypeName = "Sun Systems Cell-B video";
  407. break;
  408. case 21:PayloadTypeName = "Motion JPEG";
  409. break;
  410. case 22:PayloadTypeName = "H.261";
  411. break;
  412. case 23:PayloadTypeName = "MPEG1 or MPEG2 video";
  413. break;
  414. case 24:PayloadTypeName = "MPEG2 transport system";
  415. break;
  416. case 25:PayloadTypeName = "H.263";
  417. break;
  418. default:PayloadTypeName = "Unknown";
  419. }
  420. // end Payload Type
  421. // Call Date and Timestamp
  422. if (FlagEndPoint == 0){
  423. p_StartTime->SetWindowText(StartTime);
  424. p_StartTime->UpdateWindow();
  425. if (fs1.is_open()){
  426. fs1 << CurrentDateTimeStat << "n"; 
  427. fs1.close();
  428. }
  429. }
  430. // Payload Type
  431. p_PayloadType->SetWindowText(PayloadTypeName);
  432. p_PayloadType->UpdateWindow();
  433. if (fs2.is_open()){
  434. fs2 << PayloadTypeName << "n"; 
  435. fs2.close();
  436. }
  437. // Packet Lost
  438. str = _itoa(PacketsLostGlobal,buffer,10);
  439.   p_PacketLoss->SetWindowText(str);
  440.   p_PacketLoss->UpdateWindow();
  441. if (fs3.is_open()){
  442. fs3 << str << "n";
  443. fs3.close();
  444. }
  445. //GNUPlot related files
  446. tmpStrVar = CurrentDateTimeStat + "       " + str + "       " + pktlost_good + "       " + pktlost_acceptable + "       " + pktlost_unacceptable;
  447. if (fs3gplot.is_open()) {
  448. fs3gplot << tmpStrVar << "n";
  449. fs3gplot.close();
  450. }
  451. // Audio Jitter
  452. str = _itoa(JitterTimeGlobal,buffer,10);
  453.   p_AudioJitter->SetWindowText(str);
  454.   p_AudioJitter->UpdateWindow();
  455. if (fs4.is_open()){
  456. fs4 << str << "n";
  457. fs4.close();
  458. }
  459. //GNUPlot related file
  460. tmpStrVar = CurrentDateTimeStat + "       " + str + "       " + audjitter_good + "       " + audjitter_acceptable + "       " + audjitter_unacceptable;
  461. if (fs4gplot.is_open()){
  462. fs4gplot << tmpStrVar << "n";
  463. fs4gplot.close();
  464. }
  465. // Round Trip Delay
  466. CDlgStatistics::Ping(ipglobal);
  467. //str = _itoa(pingresult,buffer,10);
  468. str = _itoa(RoundTripTimeDelayGlobal,buffer,10);
  469. p_RoundTripDelay->SetWindowText(str);
  470. p_RoundTripDelay->UpdateWindow();
  471. if (fs5.is_open()){
  472. fs5 << str << "n";
  473. fs5.close();
  474. }
  475. //GNUPlot related file
  476. tmpStrVar = CurrentDateTimeStat + "       " + str + "       " + rtd_good  + "       " + rtd_acceptable + "       " + rtd_unacceptable;
  477. if (fs5gplot.is_open()){
  478. fs5gplot << tmpStrVar << "n";
  479. fs5gplot.close();
  480. }
  481. // Packet Sent
  482. str = _itoa(PacketSentGlobal,buffer,10);
  483.   p_PacketSent->SetWindowText(str);
  484.   p_PacketSent->UpdateWindow();
  485. if (fs6.is_open()){
  486. fs6 << str << "n";
  487. fs6.close();
  488. }
  489. // Octet Sent
  490. str = _itoa(OctetSendGlobal,buffer,10);
  491.   p_OctetSend->SetWindowText(str);
  492.   p_OctetSend->UpdateWindow();
  493. if (fs7.is_open()){
  494. fs7 << str << "n";
  495. fs7.close();
  496. }
  497. // Packet Received
  498. str = _itoa(PacketsReceivedGlobal,buffer,10);
  499.   p_PacketReceived->SetWindowText(str);
  500.   p_PacketReceived->UpdateWindow();
  501. if (fs8.is_open()){
  502. fs8 << str << "n";
  503. fs8.close();
  504. }
  505. // Octet Received
  506. str = _itoa(OctetsReceivedGlobal,buffer,10);
  507.   p_OctetReceived->SetWindowText(str);
  508.   p_OctetReceived->UpdateWindow();
  509. if (fs9.is_open()){
  510. fs9 << str << "n";
  511. fs9.close();
  512. }
  513. // Server IP
  514. p_ServerIP->SetWindowText(ipglobal);
  515. p_ServerIP->UpdateWindow();
  516. // Client IP
  517. p_ClientIP->SetWindowText(localmachine);
  518. p_ClientIP->UpdateWindow();
  519. p_PayloadType->SetWindowText(PayloadTypeName);
  520. p_PayloadType->UpdateWindow();
  521. CDialog::OnTimer(nIDEvent);
  522. }
  523. else{
  524. CWnd::KillTimer(ConnectionTimer);
  525. CDlgStatistics::KillTimer(StatisticTimer);
  526.  if (is_MsgBox_Display == 1){
  527.   // Message Box globalEndReason has been displayed
  528. }
  529.  else{
  530. if (globalEndReason = "") {
  531. // Do Nothing
  532. }
  533. else{
  534. }
  535. }
  536. FlagEndPoint = 1;
  537. }  /// stat == 0
  538. } //globalinstance->endpoint
  539. else{
  540. FlagEndPoint = 1;
  541. }
  542. } // End TRY
  543. CATCH_ALL(e){
  544. // Put some delay here
  545. }
  546. END_CATCH_ALL
  547. }
  548. int CDlgStatistics::OnCreate(LPCREATESTRUCT lpCreateStruct) 
  549. {
  550. if (CDialog::OnCreate(lpCreateStruct) == -1)
  551. return -1;
  552. // TODO: Add your specialized creation code here
  553. return 0;
  554. }
  555. // New addition for ping command
  556. // Ping()
  557. // Calls SendEchoRequest() and
  558. // RecvEchoReply() and prints results
  559. void CDlgStatistics::Ping(LPCSTR pstrHost)
  560. {
  561. SOCKET   rawSocket;
  562. LPHOSTENT lpHost;
  563. struct    sockaddr_in saDest;
  564. struct    sockaddr_in saSrc;
  565. DWORD   dwTimeSent;
  566. DWORD   dwElapsed;
  567. u_char    cTTL;
  568. int       nLoop;
  569. int       nRet;
  570. // Create a Raw socket
  571. rawSocket = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP);
  572. if (rawSocket == SOCKET_ERROR) {
  573. ReportError("socket()");
  574. return;
  575. }
  576. // Lookup host
  577. lpHost = gethostbyname(pstrHost);
  578. if (lpHost == NULL){
  579. return;
  580. }
  581. // Setup destination socket address
  582. saDest.sin_addr.s_addr = *((u_long FAR *) (lpHost->h_addr));
  583. saDest.sin_family = AF_INET;
  584. saDest.sin_port = 0;
  585. // Ping multiple times
  586. for (nLoop = 0; nLoop < 1; nLoop++){
  587. // Send ICMP echo request
  588. CDlgStatistics::SendEchoRequest(rawSocket, &saDest);
  589. // Use select() to wait for data to be received
  590. nRet = CDlgStatistics::WaitForEchoReply(rawSocket);
  591. if (nRet == SOCKET_ERROR){
  592. ReportError("select()");
  593. break;
  594. }
  595. if (!nRet){
  596. printf("nTimeOut");
  597. break;
  598. }
  599. // Receive reply
  600. dwTimeSent = CDlgStatistics::RecvEchoReply(rawSocket, &saSrc, &cTTL);
  601. // Calculate elapsed time
  602. dwElapsed = GetTickCount() - dwTimeSent;
  603. pingresult = dwElapsed;
  604. if (pingresult != 0){
  605. int a123 = 0;
  606. }
  607. }
  608. nRet = closesocket(rawSocket);
  609. if (nRet == SOCKET_ERROR)
  610. {
  611. // Do nothing
  612. ReportError("closesocket()");
  613. }
  614. }
  615. // SendEchoRequest()
  616. // Fill in echo request header
  617. // and send to destination
  618. int CDlgStatistics::SendEchoRequest(SOCKET s,LPSOCKADDR_IN lpstToAddr) 
  619. {
  620. static ECHOREQUEST echoReq;
  621. static nId = 1;
  622. static nSeq = 1;
  623. int nRet;
  624. // Fill in echo request
  625. echoReq.icmpHdr.Type = ICMP_ECHOREQ;
  626. echoReq.icmpHdr.Code = 0;
  627. echoReq.icmpHdr.Checksum = 0;
  628. echoReq.icmpHdr.ID = nId++;
  629. echoReq.icmpHdr.Seq = nSeq++;
  630. // Fill in some data to send
  631. for (nRet = 0; nRet < REQ_DATASIZE; nRet++)
  632. echoReq.cData[nRet] = ' '+nRet;
  633. // Save tick count when sent
  634. echoReq.dwTime = GetTickCount();
  635. // Put data in packet and compute checksum
  636. echoReq.icmpHdr.Checksum = in_cksum((u_short *)&echoReq, sizeof(ECHOREQUEST));
  637. // Send the echo request     
  638. nRet = sendto(s, /* socket */
  639.  (LPSTR)&echoReq, /* buffer */
  640.  sizeof(ECHOREQUEST),
  641.  0, /* flags */
  642.  (LPSOCKADDR)lpstToAddr, /* destination */
  643.  sizeof(SOCKADDR_IN));   /* address length */
  644. if (nRet == SOCKET_ERROR){
  645. // Do nothing
  646. ReportError("sendto()");
  647. }
  648. return (nRet);
  649. }
  650. // RecvEchoReply()
  651. // Receive incoming data
  652. // and parse out fields
  653. DWORD CDlgStatistics::RecvEchoReply(SOCKET s, LPSOCKADDR_IN lpsaFrom, u_char *pTTL) 
  654. {
  655. ECHOREPLY echoReply;
  656. int nRet;
  657. int nAddrLen = sizeof(struct sockaddr_in);
  658. // Receive the echo reply
  659. nRet = recvfrom(s, // socket
  660. (LPSTR)&echoReply, // buffer
  661. sizeof(ECHOREPLY), // size of buffer
  662. 0, // flags
  663. (LPSOCKADDR)lpsaFrom, // From address
  664. &nAddrLen); // pointer to address len
  665. // Check return value
  666. if (nRet == SOCKET_ERROR){
  667. // Do Nothing
  668. ReportError("recvfrom()");
  669. }
  670. // return time sent and IP TTL
  671. *pTTL = echoReply.ipHdr.TTL;
  672. return(echoReply.echoRequest.dwTime);   
  673. }
  674. // What happened?
  675. void CDlgStatistics::ReportError(LPCSTR pWhere)
  676. {
  677. fprintf(stderr,"n%s error: %dn",
  678. WSAGetLastError());
  679. }
  680. // WaitForEchoReply()
  681. // Use select() to determine when
  682. // data is waiting to be read
  683. int CDlgStatistics::WaitForEchoReply(SOCKET s)
  684. {
  685. struct timeval Timeout;
  686. fd_set readfds;
  687. readfds.fd_count = 1;
  688. readfds.fd_array[0] = s;
  689. Timeout.tv_sec = 5;
  690.     Timeout.tv_usec = 0;
  691. return(select(1, &readfds, NULL, NULL, &Timeout));
  692. }
  693. //
  694. // Mike Muuss' in_cksum() function
  695. // and his comments from the original
  696. // ping program
  697. //
  698. // * Author -
  699. // * Mike Muuss
  700. // * U. S. Army Ballistic Research Laboratory
  701. // * December, 1983
  702. /*
  703.  * I N _ C K S U M
  704.  *
  705.  * Checksum routine for Internet Protocol family headers (C Version)
  706.  *
  707.  */
  708. u_short CDlgStatistics::in_cksum(u_short *addr, int len)
  709. {
  710. register int nleft = len;
  711. register u_short *w = addr;
  712. register u_short answer;
  713. register int sum = 0;
  714. /*
  715.  *  Our algorithm is simple, using a 32 bit accumulator (sum),
  716.  *  we add sequential 16 bit words to it, and at the end, fold
  717.  *  back all the carry bits from the top 16 bits into the lower
  718.  *  16 bits.
  719.  */
  720. while( nleft > 1 )  {
  721. sum += *w++;
  722. nleft -= 2;
  723. }
  724. /* mop up an odd byte, if necessary */
  725. if( nleft == 1 ) {
  726. u_short u = 0;
  727. *(u_char *)(&u) = *(u_char *)w ;
  728. sum += u;
  729. }
  730. /*
  731.  * add back carry outs from top 16 bits to low 16 bits
  732.  */
  733. sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
  734. sum += (sum >> 16); /* add carry */
  735. answer = ~sum; /* truncate to 16 bits */
  736. return (answer);
  737. }