TcpTran.cpp
上传用户:cjw5120
上传日期:2022-05-11
资源大小:5032k
文件大小:5k
源码类别:

网络截获/分析

开发平台:

Visual C++

  1. // TcpTran.cpp: implementation of the CTcpTran class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "TcpTran.h"
  6. //////////////////////////////////////////////////////////////////////
  7. // Construction/Destruction
  8. //////////////////////////////////////////////////////////////////////
  9. /*
  10.  作者:海啸 lyyer English Name: Jack 
  11.   blog:http://lyyer.blog.sohu.com
  12.   website:http://www.cnGSG.com
  13.   海啸网络安全组织
  14. */
  15. CTcpTran::CTcpTran()
  16. {
  17. m_Socket = INVALID_SOCKET;
  18. }
  19. CTcpTran::~CTcpTran()
  20. {
  21. }
  22. BOOL CTcpTran::InitSocketLibray(int lowver,int higver )
  23. {
  24. WORD wVersion =0 ;
  25. int  errret = -1;
  26. WSADATA wsaData;
  27. wVersion = MAKEWORD(lowver,higver);
  28. errret = WSAStartup(wVersion,&wsaData);
  29. if( LOBYTE( wsaData.wVersion) != 2 ||
  30. HIBYTE( wsaData.wVersion) !=2 )
  31. {
  32. MessageBox(NULL,"winsocket库版本低","提示",MB_OK);
  33. return FALSE;
  34. }
  35. return TRUE;
  36. }
  37. SOCKET CTcpTran::InitSocket( int SocketType, string strBindIp,u_short BindPort,int opt)
  38. {
  39. SOCKET socketid = INVALID_SOCKET;
  40. socketid = socket(PF_INET,SOCK_STREAM,0);
  41. SOCKADDR_IN sockStruct;
  42. sockStruct.sin_family = AF_INET; //使用TCP/IP协议
  43. if( strBindIp.empty() )
  44. {
  45. sockStruct.sin_addr.S_un.S_addr = INADDR_ANY;
  46. }else
  47. {
  48. sockStruct.sin_addr.S_un.S_addr = inet_addr(strBindIp.c_str());
  49. }
  50.     
  51.     sockStruct.sin_port = htons(BindPort);
  52. if( SocketType == SOCKETNOBIND )
  53. {
  54. if(connect(socketid,(LPSOCKADDR)&sockStruct,sizeof(sockStruct)) == SOCKET_ERROR)
  55. {
  56. //OutputDebugString("连接错误!");
  57. closesocket(socketid);
  58. shutdown(socketid,2);
  59. socketid = INVALID_SOCKET;
  60. }
  61. m_Socket = socketid;
  62. }else if( SocketType == SOCKETBIND )
  63. {
  64. if(bind(socketid,(sockaddr*)&sockStruct,sizeof(sockaddr_in)) == SOCKET_ERROR)
  65. {
  66. closesocket(socketid);
  67. socketid = INVALID_SOCKET;
  68. }else
  69. {
  70. if( listen(socketid,SOMAXCONN) == SOCKET_ERROR )
  71. {
  72. closesocket(socketid);
  73. socketid = INVALID_SOCKET;
  74. }
  75. }
  76. m_Socket = socketid;
  77. }
  78.     
  79. return socketid;
  80. }
  81. SOCKET CTcpTran::myaccept(SOCKET s,struct sockaddr* addr,int* addrlen)
  82. {
  83. SOCKET accpsocket  = INVALID_SOCKET;
  84. accpsocket = accept(s,addr,addrlen);
  85. return accpsocket;
  86. }
  87. int CTcpTran::myrecv(SOCKET sock, char *buf, int len, int flag , int overtime ,char*EndMark,BOOL soonflag)
  88. {
  89. int ret;
  90. int nLeft = len;
  91. int idx  = 0;
  92. int nCount = 0;
  93. fd_set readfds;
  94. struct timeval  timeout;
  95. timeout.tv_sec = 0;
  96. timeout.tv_usec = 500;
  97. DWORD s_time = GetTickCount();
  98. while ( nLeft > 0 )
  99. {
  100. //接收消息
  101. MSG msg;
  102. PeekMessage(&msg, NULL,  0, 0, PM_REMOVE) ;
  103. if(msg.message == WM_QUIT)
  104. return 0;
  105. FD_ZERO( &readfds );
  106. FD_SET( sock , &readfds );
  107. if( select( 0 , &readfds , NULL , NULL , &timeout ) == SOCKET_ERROR )
  108. {
  109. return SOCKET_ERROR;
  110. }
  111. DWORD e_time = GetTickCount( );
  112. if  ( !FD_ISSET( sock , &readfds ) )
  113. {
  114. if( e_time - s_time > overtime*1000 ) 
  115. return SOCKET_TIMEOUT;
  116. else
  117. continue;
  118. }
  119. ret = recv( sock, &buf[idx], nLeft, flag );
  120. if( soonflag == TRUE )
  121. {
  122. return ret;
  123. }
  124. s_time = e_time ; // 只要有数据就重新置初始时间值
  125. if ( ret <= 0 )
  126. {
  127. int LastError = GetLastError();
  128. if ( ( -1 == ret ) && ( WSAETIMEDOUT   == LastError ) )
  129. continue;
  130. if ( ( -1 == ret ) && ( WSAEWOULDBLOCK   == LastError ) )
  131. {
  132. if ( nCount < 2000 )
  133. {
  134. Sleep( 10 );
  135. nCount++;
  136. continue;
  137. }
  138. }
  139. return ret;
  140. }
  141. nCount = 0;
  142. nLeft -= ret;
  143. idx += ret;
  144. if( EndMark != NULL && idx>5)
  145. {
  146. if( strstr(buf+(idx-5),EndMark) != NULL )
  147. {
  148. break;
  149. }
  150. }
  151. }
  152. return idx;
  153. }
  154. int CTcpTran::mysend(SOCKET sock, const char *buf, int len, int flag,int overtime)
  155. {
  156. int ret;
  157. int nLeft = len;
  158. int idx  = 0;
  159. fd_set readfds;
  160. struct timeval  timeout;
  161. timeout.tv_sec = 0;
  162. timeout.tv_usec = 500;
  163. DWORD s_time = GetTickCount();
  164. while ( nLeft > 0 )
  165. {
  166. MSG msg;
  167. PeekMessage(&msg, NULL,  0, 0, PM_REMOVE) ;
  168. if(msg.message == WM_QUIT)
  169. return 0;
  170. FD_ZERO( &readfds );
  171. FD_SET( sock , &readfds );
  172. int errorret   = select( 0 , NULL, &readfds, NULL , &timeout );
  173. if( errorret == SOCKET_ERROR )
  174. {
  175. OutputDebugString("mysendEx SOCKET 错误");
  176. return SOCKET_ERROR;
  177. }
  178. DWORD e_time = GetTickCount( );
  179. if  ( !FD_ISSET( sock , &readfds ) )
  180. {
  181. if( e_time - s_time > overtime*1000 ) 
  182. {
  183. OutputDebugString("mysendEx发送数据超时");
  184. return 0;
  185. }
  186. else
  187. {
  188. //OutputDebugString("发送数据FD_ISSET 超时");
  189. continue;
  190. }
  191. }
  192. ret = send( sock, &buf[idx], nLeft, flag );
  193. if ( ret <= 0 )
  194. {
  195. return ret;
  196. }
  197. nLeft -= ret;
  198. idx += ret;
  199. }
  200. return len;
  201. }