TestNetDlg.cpp
上传用户:liguizhu
上传日期:2015-11-01
资源大小:2422k
文件大小:10k
源码类别:

P2P编程

开发平台:

Visual C++

  1. /*
  2.  *  Openmysee
  3.  *
  4.  *  This program is free software; you can redistribute it and/or modify
  5.  *  it under the terms of the GNU General Public License as published by
  6.  *  the Free Software Foundation; either version 2 of the License, or
  7.  *  (at your option) any later version.
  8.  *
  9.  *  This program is distributed in the hope that it will be useful,
  10.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.  *  GNU General Public License for more details.
  13.  *
  14.  *  You should have received a copy of the GNU General Public License
  15.  *  along with this program; if not, write to the Free Software
  16.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  17.  *
  18.  */
  19. //
  20. #include "stdafx.h"
  21. #include "GVCapture.h"
  22. #include "TestNetDlg.h"
  23. #include ".testnetdlg.h"
  24. const int SOCKET_MAJOR_VERSION = 2;
  25. const int SOCKET_MINOR_VERSION = 2;
  26. const int SOCKET_SUCCESS = 0;
  27. // CTestNetDlg dialog
  28. IMPLEMENT_DYNAMIC(CTestNetDlg, CDialog)
  29. CTestNetDlg::CTestNetDlg(CWnd* pParent /*=NULL*/)
  30. : CDialog(CTestNetDlg::IDD, pParent)
  31. {
  32. InitializeCriticalSection(&moCriticalSection);
  33. }
  34. CTestNetDlg::~CTestNetDlg()
  35. {
  36. UnInitSock();
  37. DeleteCriticalSection(&moCriticalSection);
  38. }
  39. void CTestNetDlg::DoDataExchange(CDataExchange* pDX)
  40. {
  41. CDialog::DoDataExchange(pDX);
  42. DDX_Control(pDX, IDC_COMBO_IP_NET, mcomboxIPAry);
  43. DDX_Text(pDX, IDC_STATE_EDIT, mstrState);
  44. }
  45. void CTestNetDlg::GetAddr(CString astrSPAddress)
  46. {
  47. CString lstrSpAddress;
  48. while (-1 != astrSPAddress.Find(':'))
  49. {
  50. lstrSpAddress = astrSPAddress.Left(astrSPAddress.Find(':'));
  51. lstrSpAddress.Trim();
  52. mStrAryIPAry.Add(lstrSpAddress);
  53. astrSPAddress = astrSPAddress.Right(astrSPAddress.GetLength() 
  54. - astrSPAddress.Find(':') - 1);
  55. }
  56. if (0 != astrSPAddress.GetLength())
  57. {
  58. lstrSpAddress = astrSPAddress;
  59. lstrSpAddress.Trim();
  60. mStrAryIPAry.Add(lstrSpAddress);
  61. }
  62. }
  63. BEGIN_MESSAGE_MAP(CTestNetDlg, CDialog)
  64. ON_BN_CLICKED(IDC_TEST, OnBnClickedTest)
  65. ON_BN_CLICKED(IDC_BTN_TEST_ALL, OnBnClickedBtnTestAll)
  66. END_MESSAGE_MAP()
  67. // CTestNetDlg message handlers
  68. BOOL CTestNetDlg::OnInitDialog()
  69. {
  70. CDialog::OnInitDialog();
  71. if (SOCKET_SUCCESS != InitSock())
  72. {
  73. AfxMessageBox("初始化WinSock失败,测试失败,请退出");
  74. WSACleanup();
  75. return TRUE;
  76. }
  77. for(int i = 0; i < mStrAryIPAry.GetSize(); i++)
  78. {
  79. mcomboxIPAry.AddString(mStrAryIPAry.GetAt(i));
  80. }
  81. mcomboxIPAry.SetCurSel(0);
  82. // TODO:  Add extra initialization here
  83. mstrState = "请点击测试按钮开始测试";
  84. //GetDlgItem(IDC_BTN_TEST_ALL)->SetFocus();
  85. ::SetFocus(GetDlgItem(IDC_BTN_TEST_ALL)->GetSafeHwnd());
  86. UpdateData(false);
  87. return TRUE;  // return TRUE unless you set the focus to a control
  88. // EXCEPTION: OCX Property Pages should return FALSE
  89. }
  90. void CTestNetDlg::OnBnClickedTest()
  91. {
  92. int i = 0;
  93. CString lstrCurSel;
  94. CONNECT_RESULT ret = CR_ERROR;
  95. GetDlgItem(IDC_TEST)->SetWindowText("正在测试");
  96. GetDlgItem(IDC_TEST)->EnableWindow(false);
  97. if((i = mcomboxIPAry.GetCurSel()) != CB_ERR)
  98. {
  99. mcomboxIPAry.GetLBText(i, lstrCurSel);
  100. }
  101. //lsockAddr = GetCurAddrin(lstrCurSel);
  102. mstrState = "正在测试lstrCurSel,请稍后";
  103. GetDlgItem(IDC_STATE_EDIT)->SetWindowText( "正在测试lstrCurSel,请稍后");
  104. //UpdateData(false);
  105. if (TRUE == TestNet(lstrCurSel))
  106. {
  107. mstrState = lstrCurSel + "连通";
  108. }
  109. else
  110. {
  111. mstrState =lstrCurSel + "未连接";
  112. }
  113. UpdateData(false);
  114. GetDlgItem(IDC_TEST)->EnableWindow();
  115. GetDlgItem(IDC_TEST)->SetWindowText("测试");
  116. }
  117. //与网络相关的函数
  118. SOCKADDR_IN CTestNetDlg::GetCurAddrin(CString astrIPAddr)
  119. {
  120. SOCKADDR_IN lsockAddr;
  121. ZeroMemory(&lsockAddr,sizeof(lsockAddr));
  122. lsockAddr.sin_family = AF_INET;
  123. lsockAddr.sin_port = htons(20);
  124. lsockAddr.sin_addr.s_addr = inet_addr((LPCTSTR)astrIPAddr);
  125. return lsockAddr;
  126. }
  127. //初始化WinSock
  128. int CTestNetDlg::InitSock()
  129. {
  130. WSADATA         WSD;
  131. WORD wVersionRequired = MAKEWORD(SOCKET_MAJOR_VERSION, SOCKET_MINOR_VERSION);
  132. ZeroMemory(&WSD,sizeof(WSADATA));
  133. int nErrorNo = WSAStartup(wVersionRequired, &WSD);
  134. if ( SOCKET_SUCCESS != nErrorNo )
  135. {
  136. return ( SOCKET_ERROR );
  137. }
  138. if ( LOBYTE( WSD.wVersion ) != SOCKET_MINOR_VERSION ||
  139.  HIBYTE( WSD.wVersion ) != SOCKET_MAJOR_VERSION ) 
  140. {
  141. WSACleanup();
  142. return (SOCKET_ERROR); 
  143. }
  144.  
  145. //成功初始化
  146. return (SOCKET_SUCCESS);
  147. }
  148. //反初始化Winsock
  149. void CTestNetDlg::UnInitSock()
  150. {
  151. WSACleanup();
  152. }
  153. //开始连接
  154. CONNECT_RESULT CTestNetDlg::Connecting(SOCKET& asocket, CString astrIPAddr) 
  155. {
  156. CONNECT_RESULT ret = CR_ERROR;
  157. // Create a TCP/IP socket that is bound to the server.
  158. // Microsoft Knowledge Base: WSA_FLAG_OVERLAPPED Is Needed for Non-Blocking Sockets
  159. // http://support.microsoft.com/default.aspx?scid=kb;EN-US;179942
  160. asocket = WSASocket(AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED);
  161. if(asocket == INVALID_SOCKET) 
  162. {
  163. return ret;
  164. }
  165. // 不使用Nagle算法
  166. BOOL bNoDelay = TRUE;
  167. if(setsockopt(asocket, SOL_SOCKET, TCP_NODELAY, (const char*)&bNoDelay, sizeof(bNoDelay)) == SOCKET_ERROR) 
  168. {
  169. return ret;
  170. }
  171. // Set this socket as a Non-blocking socket.
  172. ULONG flag = 1;
  173. if(ioctlsocket(asocket, FIONBIO, &flag) == SOCKET_ERROR)
  174. {
  175. return ret;
  176. }
  177. SOCKADDR_IN lsockAddr;
  178. lsockAddr = GetCurAddrin(astrIPAddr);
  179. // Connect to remote address
  180. if(WSAConnect(asocket, (sockaddr*)&lsockAddr, sizeof(lsockAddr), NULL, NULL, NULL, NULL) == SOCKET_ERROR) 
  181. {
  182. if(WSAGetLastError() != WSAEWOULDBLOCK) 
  183. {
  184. return ret;
  185. }
  186. else 
  187. {
  188. ret = CR_WOULDBLOCK;
  189. }
  190. }
  191. else 
  192. {
  193. ret = CR_CONNECTED;
  194. }
  195. return ret;
  196. }
  197. //断开连接
  198. void CTestNetDlg::Disconnect(SOCKET& asocket) 
  199. {
  200. if(asocket != INVALID_SOCKET)
  201. {
  202. closesocket(asocket);
  203. asocket = INVALID_SOCKET;
  204. }
  205. }
  206. //测试网络
  207. BOOL CTestNetDlg::TestNet(CString astrCurIP)
  208. {
  209. BOOL lisConnected = FALSE;
  210. fd_set write_set;
  211. CONNECT_RESULT lnetret = CR_ERROR;
  212. timeval timeout;
  213. ZeroMemory(&timeout,sizeof(timeval));
  214. SOCKET lsocket;
  215. lnetret =Connecting(lsocket, astrCurIP);
  216. if(lnetret == CR_WOULDBLOCK) 
  217. {
  218. // 等待8秒钟,看能否连接上
  219. FD_ZERO(&write_set);
  220. FD_SET(lsocket, &write_set);
  221. timeout.tv_sec = 8;
  222. timeout.tv_usec = 0;
  223. int s = select(0, NULL, &write_set, NULL, &timeout);
  224. if(s > 0)
  225. {
  226. lisConnected = TRUE;
  227. Disconnect(lsocket);
  228. }
  229. }
  230. return lisConnected;
  231. }
  232. void CTestNetDlg::OnBnClickedBtnTestAll()
  233. {
  234. CString lstrIP;
  235. CONNECT_RESULT lnetret = CR_ERROR;
  236. UpdateData();
  237. GetDlgItem(IDC_BTN_TEST_ALL)->SetWindowText("正在测试");
  238. GetDlgItem(IDC_BTN_TEST_ALL)->EnableWindow(false);
  239. if (0 == mStrAryIPAry.GetSize())
  240. {
  241. return ;
  242. }
  243. mpstruConnect = new STRU_CONNECT[mStrAryIPAry.GetSize()];
  244. if (NULL == mpstruConnect)
  245. {
  246. return;
  247. }
  248. DWORD ldwThreadId = 0;
  249. HANDLE lhHandle = NULL;
  250. minum = 0;
  251. for(int i = 0; i < mStrAryIPAry.GetSize(); i++)
  252. {
  253. mpstruConnect[i].mbResult = FALSE;
  254. mpstruConnect[i].msocket = 0;
  255. mpstruConnect[i].mstrIP = mStrAryIPAry.GetAt(i);
  256. lhHandle = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)(CTestNetDlg::ConnectProc), this, 0, &ldwThreadId); 
  257. if (NULL == lhHandle)
  258. {
  259. AfxMessageBox("检测失败");
  260. if (NULL != mpstruConnect)
  261. {
  262. for (i = 0; i < mStrAryIPAry.GetSize(); i++)
  263. {
  264. Disconnect(mpstruConnect[i].msocket);
  265. }
  266. delete []mpstruConnect;
  267. mpstruConnect = NULL;
  268. }
  269. return;
  270. }
  271. CloseHandle(lhHandle);
  272. Sleep(200);
  273. }
  274. Sleep(1000);
  275. GetResult();
  276. DisplayResult();
  277. GetDlgItem(IDC_BTN_TEST_ALL)->SetWindowText("测试全部");
  278. GetDlgItem(IDC_BTN_TEST_ALL)->EnableWindow();
  279. if (NULL != mpstruConnect)
  280. {
  281. for (i = 0; i < mStrAryIPAry.GetSize(); i++)
  282. {
  283. Disconnect(mpstruConnect[i].msocket);
  284. }
  285. delete []mpstruConnect;
  286. mpstruConnect = NULL;
  287. }
  288. }
  289. void WINAPI CTestNetDlg::ConnectProc(CTestNetDlg* apTestNetDlg)
  290. {
  291. int i = 0; //取得该线程的序号
  292. CONNECT_RESULT lnetret = CR_ERROR; //运行结果
  293. fd_set lwrite_set; //Select管理的套接字
  294. timeval timeout;
  295. ZeroMemory(&timeout,sizeof(timeval));
  296. if (NULL == apTestNetDlg->mpstruConnect)
  297. {
  298. return ;
  299. }
  300. EnterCriticalSection(&apTestNetDlg->moCriticalSection);
  301. i = apTestNetDlg->minum;
  302. ++ apTestNetDlg->minum;
  303. LeaveCriticalSection(&apTestNetDlg->moCriticalSection);
  304. //进行连接
  305. lnetret = apTestNetDlg->Connecting(apTestNetDlg->mpstruConnect[i].msocket, apTestNetDlg->mpstruConnect[i].mstrIP);
  306. if(lnetret == CR_WOULDBLOCK) 
  307. {
  308. // 等待8秒钟,看能否连接上
  309. FD_ZERO(&lwrite_set);
  310. FD_SET(apTestNetDlg->mpstruConnect[i].msocket, &lwrite_set);
  311. timeout.tv_sec = 8;
  312. timeout.tv_usec = 0;
  313. int s = select(0, NULL, &lwrite_set, NULL, &timeout);
  314. if(s > 0)
  315. {
  316. apTestNetDlg->mpstruConnect[i].mbResult = TRUE;
  317. apTestNetDlg->Disconnect(apTestNetDlg->mpstruConnect[i].msocket);
  318. }
  319. }
  320. }
  321. void CTestNetDlg::GetResult()
  322. {
  323. bool lbRun;
  324. DWORD ldwElaps = 0;
  325. ldwElaps = GetTickCount();
  326. do
  327. {
  328. lbRun = false;
  329. for (int i = 0; i < mStrAryIPAry.GetSize(); i++)
  330. {
  331. if (INVALID_SOCKET != mpstruConnect[i].msocket)
  332. {
  333. lbRun = true;
  334. break;
  335. }
  336. }
  337. if (ldwElaps + 10000 < GetTickCount())
  338. {
  339. lbRun = false;
  340. }
  341. }
  342. while (lbRun);
  343. }
  344. void CTestNetDlg::DisplayResult()
  345. {
  346. mstrState = "全部网络测试结果:";
  347. for (int i = 0; i < mStrAryIPAry.GetSize(); i++)
  348. {
  349. mstrState += mpstruConnect[i].mstrIP;
  350. if (TRUE == mpstruConnect[i].mbResult)
  351. {
  352. mstrState += "连接成功";
  353. }
  354. else
  355. {
  356. mstrState += "连接失败";
  357. }
  358. }
  359. UpdateData(false);
  360. }