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

P2P编程

开发平台:

Visual C++

  1. ////////////////////////////////////////////////////////////////////////////////
  2. // Copyright (C) 2000-2001 Softelf Inc. All rights reserved.
  3. ////////////////////////////////////////////////////////////////////////////////
  4. //
  5. // Author : Telan 
  6. // Date : 2000-10-04
  7. // Purpose : Encapsulate winsock2 functions to make it more easily used 
  8. // History : 
  9. // 1.0 : 2000-03-10 - First Edition of this source code ( called:FE_SOCKET )
  10. // 2.0 : 2000-06-25 - Second Edition ( name changed to TE_SOCKET )
  11. //  - Add Error Control
  12. // 3.0 : 2000-09-21 - Third Edition ( name changed to TE_SOCKET )
  13. //  - Change the errors' process mechanism
  14. //  - Add BufSocket Model
  15. //  - Add TE_ConnectEx(...)
  16. //  - Add TE_BSocketGetData(...) for specail usage
  17. // 3.1 : 2000-10-04 - Add TE_AcceptEx(...)
  18. //  - Add TE_GetIP(...) to fix NT DNS resolve cache problem
  19. //  - Modify TE_ConnectEx
  20. //  - Fix several bugs in NetEvent process
  21. //
  22. // Mailto : telan@263.net ( Bugs' Report or Comments )
  23. // Notes : This source code may be used in any form in any way you desire. It is
  24. //   provided "as is" without express or implied warranty. Use it at your own
  25. //   risk! The author accepts no liability for any damage/loss of business 
  26. //   that this product may cause.
  27. //
  28. ////////////////////////////////////////////////////////////////////////////////
  29. #include "stdafx.h"
  30. #include "TE_Socket.h"
  31. //需要ws2_32.lib库
  32. #pragma comment(lib,"ws2_32.lib")
  33. //错误代号
  34. static /*__declspec(thread)*/ int _iThreadedErrorNo = 0;
  35. // 辅助函数
  36. //获取最近一次操作的错误代码
  37. int TE_GetLastError()
  38. {
  39. return (_iThreadedErrorNo);
  40. }
  41. //设置错误代码
  42. void TE_SetLastError(int iErrorCode)
  43. {
  44. _iThreadedErrorNo = iErrorCode;
  45. }
  46. /////////////////////////////////////////////////////////////////////////
  47. // Winsock2 函数
  48. /////////////////////////////////////////////////////////////////////////
  49. //初始化Winsock2动态连接库
  50. int TE_InitLibrary()
  51. {
  52. WSADATA         WSD;
  53. WORD wVersionRequired = MAKEWORD( TE_SOCKET_MAJOR_VERSION,TE_SOCKET_MINOR_VERSION );
  54. ZeroMemory(&WSD,sizeof(WSADATA));
  55. int nErrorNo = WSAStartup(wVersionRequired, &WSD);
  56. if ( SOCKET_SUCCESS != nErrorNo )
  57. {
  58. TE_SetLastError( nErrorNo );
  59. return ( SOCKET_ERROR );
  60. }
  61. if ( LOBYTE( WSD.wVersion ) != TE_SOCKET_MINOR_VERSION ||
  62.  HIBYTE( WSD.wVersion ) != TE_SOCKET_MAJOR_VERSION ) 
  63. {
  64. WSACleanup( );
  65. TE_SetLastError( WSAVERNOTSUPPORTED );
  66. return (SOCKET_ERROR); 
  67. }
  68.  
  69. //成功初始化
  70. return (SOCKET_SUCCESS);
  71. }
  72. //释放Winsock2动态连接库
  73. void TE_CleanupLibrary(void)
  74. {
  75.     WSACleanup();
  76. }
  77. //设置套接字属性
  78. int TE_SetSocketOption(SOCKET hSocket)
  79. {
  80.     int             iActivate = 1;
  81. //允许地址重用
  82.     if (setsockopt(hSocket, SOL_SOCKET, SO_REUSEADDR, (const char *) &iActivate,sizeof(iActivate)) == SOCKET_ERROR )
  83.     {
  84.         TE_SetLastError( WSAGetLastError() );
  85.         return (SOCKET_ERROR);
  86.     }
  87. //  如果支持,设置KEEPALIVE属性 (这样做会带来其他不良后果)
  88. //setsockopt(hSocket, SOL_SOCKET, SO_KEEPALIVE, (const char *) &iActivate,sizeof(iActivate));
  89. return (SOCKET_SUCCESS);
  90. }
  91. //创建具有重叠IO能力的套接字
  92. SOCKET TE_CreateSocket(int iAddressFamily /*= AF_INET*/, int iType/*= SOCK_STREAM*/,int iProtocol/*= 0*/)
  93. {
  94. SOCKET hSocket = WSASocket(iAddressFamily, iType, iProtocol, NULL,0,WSA_FLAG_OVERLAPPED);
  95. if ( hSocket == INVALID_SOCKET )
  96. {
  97. TE_SetLastError( WSAGetLastError() );
  98. return (INVALID_SOCKET);
  99. }
  100. //设置套接字选项
  101. if ( SOCKET_ERROR == TE_SetSocketOption(hSocket) ) //设置属性失败
  102. {
  103. TE_CloseSocket(hSocket, TRUE);
  104. return (INVALID_SOCKET);
  105. }
  106. return (hSocket);
  107. }
  108. //关闭套接字
  109. void TE_CloseSocket(SOCKET hSocket, BOOL bHardClose)
  110. {
  111. // 不需要捕获错误
  112. if (!bHardClose) // 优雅关闭 Graceful close
  113. {
  114. // 不再发送数据,对于TCP套接字,在所有的数据都发送完毕之后,
  115. // 将发送一个 FIN ,通知接收方所有数据已经发送完毕。
  116. shutdown(hSocket, SD_SEND);
  117. // 接收缓冲区有可能还有未接收的数据,在关闭套接字之前应该先
  118. // 读取残留的数据。
  119. int iRecvResult;
  120. HANDLE hSocketEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  121. char szBuffer[256];
  122. do
  123. {
  124. if (hSocketEvent != NULL)
  125. {
  126. //注册网络事件
  127. WSAEventSelect(hSocket, (WSAEVENT) hSocketEvent, FD_READ | FD_CLOSE);
  128. WSAWaitForMultipleEvents(1, &hSocketEvent, TRUE,TE_SHUTDOWN_RECV_TIMEOUT, TRUE);
  129. //清除网络事件
  130. WSAEventSelect(hSocket, (WSAEVENT) hSocketEvent, 0);
  131. }
  132. ZeroMemory(szBuffer,256);
  133. iRecvResult = TE_RecvLL(hSocket, szBuffer, sizeof(szBuffer));
  134. } while (iRecvResult > 0);
  135. if (hSocketEvent != NULL)
  136. CloseHandle(hSocketEvent);
  137. //不再允许接收和发送
  138. shutdown(hSocket, SD_BOTH);
  139. }
  140. // 关闭套接字
  141. closesocket(hSocket);
  142. }
  143. // 一次性接收数据(重叠IO)
  144. int TE_RecvLL(SOCKET hSocket, char *pszBuffer, int iBufferSize)
  145. {
  146. DWORD dwRtxBytes = 0,
  147. dwRtxFlags = 0;
  148. WSABUF WSABuff;
  149. //清空缓冲
  150. ZeroMemory(&WSABuff,sizeof(WSABUF));
  151. WSABuff.len = iBufferSize;
  152. WSABuff.buf = pszBuffer;
  153. return ((WSARecv(hSocket, &WSABuff, 1, &dwRtxBytes, &dwRtxFlags,NULL, NULL) == SOCKET_SUCCESS) ? (int) dwRtxBytes : -WSAGetLastError());
  154. }
  155. // 接收数据(阻塞直至收到数据为止)
  156. int TE_RecvData(SOCKET hSocket, char *pszBuffer, int iBufferSize, DWORD dwTimeout)
  157. {
  158. HANDLE hReadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  159. if (hReadEvent == NULL)
  160. {
  161. TE_SetLastError( (int)GetLastError() );
  162. return ( SOCKET_ERROR );
  163. }
  164. int iRecvBytes = 0;
  165. DWORD dwWaitResult ;
  166. for (;;)
  167. {
  168. // 注册FD_READ | FD_CLOSE 事件 
  169. // (因为可能在等待FD_READ事件中,对方关闭套接字,所以要关注FD_CLOSE)
  170. if( WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, FD_READ | FD_CLOSE) == SOCKET_ERROR)
  171. {
  172. CloseHandle(hReadEvent);
  173. TE_SetLastError( WSAGetLastError() );
  174. return (SOCKET_ERROR);
  175. }
  176. // 等等FD_READ | FD_CLOSE事件的发生
  177. dwWaitResult = WSAWaitForMultipleEvents(1, &hReadEvent, TRUE,dwTimeout, TRUE);
  178. if (dwWaitResult != WSA_WAIT_EVENT_0)
  179. {
  180. // 清除事件
  181. WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
  182. CloseHandle(hReadEvent);
  183. TE_SetLastError( WSAGetLastError() );
  184. return (SOCKET_ERROR);
  185. }
  186. ////////////////////////////////////////////////////////////// 
  187. /// 注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该 
  188. /// 进一步检查网络是否发生错误
  189. ///////////////////////////////////////////////////////////////
  190. WSANETWORKEVENTS NetEvent;
  191. if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hReadEvent,&NetEvent) == SOCKET_ERROR)
  192. {
  193. // 清除事件
  194. WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
  195. CloseHandle(hReadEvent);
  196. TE_SetLastError( WSAGetLastError() );
  197. return (SOCKET_ERROR);
  198. }
  199. //判断发生了什么事件 FD_READ 或 FD_CLOSE
  200. if( ( NetEvent.lNetworkEvents == FD_CLOSE ) ||
  201.  ( NetEvent.lNetworkEvents == FD_READ && 
  202.    NetEvent.iErrorCode[FD_READ_BIT] !=0 ) ) // 发生错误
  203. {
  204. // 清除事件
  205. WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
  206. CloseHandle(hReadEvent);
  207. TE_SetLastError(WSAGetLastError() );
  208. return (SOCKET_ERROR);
  209. }
  210. ////////////////////////////////////////////////////////////////
  211. // 清除事件
  212. WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
  213. // 接收数据
  214. if ((iRecvBytes = TE_RecvLL(hSocket, pszBuffer, iBufferSize)) >= 0)
  215. break; // 跳出循环
  216. int iErrorCode = -iRecvBytes;
  217. if ( iErrorCode != WSAEWOULDBLOCK ) //太多的未完成重叠操作
  218. {
  219. CloseHandle(hReadEvent);
  220. TE_SetLastError( iErrorCode );
  221. return (SOCKET_ERROR);
  222. }
  223. //阻塞住了
  224. ////////////////////////////////////////////////////////////////////////
  225. //  如果发生阻塞,就等待一定时间后重试,以免CPU轮询浪费时间
  226. ////////////////////////////////////////////////////////////////////////
  227. Sleep(TE_BLOCKED_SNDRCV_SLEEP);
  228.     }
  229.     CloseHandle(hReadEvent);
  230.     return (iRecvBytes);
  231. }
  232. // 接收数据直至达到规定的长度(缓冲区满)或超时或没有数据可读取时
  233. int TE_Recv(SOCKET hSocket, char *pszBuffer, int iBufferSize, DWORD dwTimeout)
  234. {
  235. int iRtxBytes = 0;
  236. int iRtxCurrent = 0;
  237. while (iRtxBytes < iBufferSize)
  238. {
  239. iRtxCurrent = TE_RecvData(hSocket, (pszBuffer + iRtxBytes),(iBufferSize - iRtxBytes), dwTimeout);
  240. if (iRtxCurrent < 0) //没有数据可读取
  241. return (iRtxBytes);
  242. iRtxBytes += iRtxCurrent;
  243. }
  244. return (iRtxBytes);
  245. }
  246. //一次性发送数据(重叠IO)
  247. int TE_SendLL(SOCKET hSocket, char const * pszBuffer, int iBufferSize)
  248. {
  249. DWORD dwRtxBytes = 0;
  250. WSABUF WSABuff;
  251. ZeroMemory(&WSABuff,sizeof(WSABUF));
  252. WSABuff.len = iBufferSize;
  253. WSABuff.buf = (char *) pszBuffer;
  254. return ((WSASend(hSocket, &WSABuff, 1, &dwRtxBytes, 0,NULL, NULL) == SOCKET_SUCCESS) ? (int) dwRtxBytes : -WSAGetLastError());
  255. }
  256. // 发送数据
  257. int TE_SendData(SOCKET hSocket, char const * pszBuffer, int iBufferSize, DWORD dwTimeout)
  258. {
  259. HANDLE hWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  260. if (hWriteEvent == NULL)
  261. {
  262. TE_SetLastError( (int)GetLastError() );
  263. return (SOCKET_ERROR);
  264. }
  265. int iSendBytes = 0;
  266. for (;;)
  267. {
  268. ////////////////////////////////////////////////////////////////
  269. // 发送数据成功
  270. if ((iSendBytes = TE_SendLL(hSocket, pszBuffer, iBufferSize)) >= 0)
  271. break;
  272. int iErrorCode = -iSendBytes;
  273. if (iErrorCode != WSAEWOULDBLOCK)
  274. {
  275. CloseHandle(hWriteEvent);
  276. TE_SetLastError( WSAGetLastError() );
  277. return (SOCKET_ERROR);
  278. }
  279. ///////////////////////////////////////////////////////////////////////////////
  280. //  睡眠一段时间
  281. ///////////////////////////////////////////////////////////////////////////////
  282. Sleep(TE_BLOCKED_SNDRCV_SLEEP);
  283. // 注册FD_WRITE | FD_CLOSE 事件
  284. if( WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, FD_WRITE|FD_CLOSE) == SOCKET_ERROR)
  285. {
  286. CloseHandle(hWriteEvent);
  287. TE_SetLastError( WSAGetLastError() );
  288. return (SOCKET_ERROR);
  289. }
  290. // 等待事件发生
  291. DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hWriteEvent, TRUE,dwTimeout, TRUE);
  292. if (dwWaitResult != WSA_WAIT_EVENT_0)
  293. {
  294. // 清除网络事件
  295. WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
  296. CloseHandle(hWriteEvent);
  297. TE_SetLastError( WSAGetLastError() );
  298. return (SOCKET_ERROR);
  299. }
  300. ////////////////////////////////////////////////////////////// 
  301. /// 注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该 
  302. /// 进一步检查网络是否发生错误
  303. ///////////////////////////////////////////////////////////////
  304. WSANETWORKEVENTS NetEvent;
  305. if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hWriteEvent,&NetEvent) == SOCKET_ERROR)
  306. {
  307.    // 清除网络事件
  308. WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
  309. CloseHandle(hWriteEvent);
  310. TE_SetLastError( WSAGetLastError() );
  311. return (SOCKET_ERROR);
  312. }
  313. if( ( NetEvent.lNetworkEvents == FD_CLOSE ) ||
  314.  ( NetEvent.lNetworkEvents == FD_WRITE   &&
  315. NetEvent.iErrorCode[FD_WRITE_BIT] !=0 ) ) // 发生错误
  316. {
  317. // 清除网络事件
  318. WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
  319. CloseHandle(hWriteEvent);
  320. TE_SetLastError( WSAGetLastError() );
  321. return (SOCKET_ERROR);
  322. }
  323. // 清除网络事件
  324. WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
  325.    }
  326.     CloseHandle(hWriteEvent);
  327.     return (iSendBytes);
  328. }
  329. //发送完所有数据或超时
  330. int TE_Send(SOCKET hSocket, char const * pszBuffer, int iBufferSize, DWORD dwTimeout)
  331. {
  332. int iRtxBytes = 0;
  333. int iRtxCurrent = 0;
  334. while (iRtxBytes < iBufferSize)
  335. {
  336. iRtxCurrent = TE_SendData(hSocket, (pszBuffer + iRtxBytes),(iBufferSize - iRtxBytes), dwTimeout);
  337. if (iRtxCurrent < 0)
  338. return (iRtxBytes);
  339. iRtxBytes += iRtxCurrent;
  340. }
  341. return (iRtxBytes);
  342. }
  343. // 建立连接
  344. int TE_Connect(SOCKET hSocket, const struct sockaddr * pSocketAddress, int iNameLen,DWORD dwTimeout)
  345. {
  346. HANDLE hConnectEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  347. if (hConnectEvent == NULL)
  348. {
  349. TE_SetLastError( (int)GetLastError() );
  350. return (SOCKET_ERROR);
  351. }
  352. // 注册FD_CONNECT事件
  353. if( WSAEventSelect(hSocket, (WSAEVENT) hConnectEvent, FD_CONNECT) == SOCKET_ERROR)
  354. {
  355. CloseHandle(hConnectEvent);
  356. TE_SetLastError( WSAGetLastError() );
  357. return (SOCKET_ERROR);
  358. }
  359. int iConnectResult = WSAConnect(hSocket, pSocketAddress, iNameLen, NULL, NULL, NULL, NULL);
  360. int iConnectError  = WSAGetLastError();
  361. if ((iConnectResult == SOCKET_ERROR) && (iConnectError == WSAEWOULDBLOCK))
  362. {
  363. DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hConnectEvent, TRUE,dwTimeout, TRUE);
  364. if (dwWaitResult != WSA_WAIT_EVENT_0)
  365. {
  366. TE_SetLastError( WSAGetLastError() );
  367. iConnectResult = SOCKET_ERROR;
  368. }
  369. else
  370. {
  371. ////////////////////////////////////////////////////////////// 
  372. /// 注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该 
  373. /// 进一步检查网络是否发生错误
  374. ///////////////////////////////////////////////////////////////
  375. WSANETWORKEVENTS NetEvent;
  376. if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hConnectEvent,&NetEvent) == SOCKET_ERROR)
  377. {
  378. TE_SetLastError( WSAGetLastError() );
  379. iConnectResult = SOCKET_ERROR;
  380. }
  381. else if(NetEvent.iErrorCode[FD_CONNECT_BIT] !=0 ) // 发生错误
  382. {
  383. TE_SetLastError( NetEvent.iErrorCode[FD_CONNECT_BIT] );
  384. iConnectResult = SOCKET_ERROR;
  385. }
  386. else
  387. iConnectResult = SOCKET_SUCCESS;
  388. ////////////////////////////////////////////////////////////////
  389. }
  390. }
  391. // 注销网络事件
  392. WSAEventSelect(hSocket, (WSAEVENT) hConnectEvent, 0);
  393. CloseHandle(hConnectEvent);
  394. return (iConnectResult);
  395. }
  396. ///////////////////////////////////////////////////////////
  397. //
  398. // 引入该函数的目的是为了避免NT下对域名解析的CACHE造成的问题
  399. //
  400. ///////////////////////////////////////////////////////////
  401. DWORD WINAPI DNSThread(  LPVOID pParam )
  402. {
  403. DWORD dwIP = INADDR_NONE;
  404. PHOSTENT pHost = gethostbyname( (char *)pParam );
  405. if(pHost == NULL)
  406. return INADDR_NONE;
  407. dwIP = inet_addr( inet_ntoa(*(IN_ADDR *)*pHost->h_addr_list) );
  408. return dwIP;
  409. }
  410. DWORD TE_GetIP(const char* name,BOOL fFixNtDNS /* = FALSE*/) // Used to Fix NT DNS Problem
  411. {
  412. DWORD dwIP = inet_addr(name);
  413. if( dwIP != INADDR_NONE )
  414. return dwIP;
  415. if( fFixNtDNS )
  416. {
  417. OSVERSIONINFO osVersion;
  418. osVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  419. if( GetVersionEx(&osVersion) )
  420. {
  421. if(osVersion.dwPlatformId == VER_PLATFORM_WIN32_NT)
  422. {
  423. DWORD dwThreadId = 0;
  424. HANDLE hThread = CreateThread(NULL,0,DNSThread,(LPVOID)name,0,&dwThreadId);
  425. if( hThread != NULL)
  426. {
  427. WaitForSingleObject(hThread,INFINITE);
  428. if( GetExitCodeThread(hThread,&dwIP))
  429. return dwIP;
  430. }
  431. }
  432. }
  433. }
  434. PHOSTENT pHost = gethostbyname(name);
  435. if(pHost == NULL)
  436. return INADDR_NONE;
  437. dwIP = inet_addr( inet_ntoa(*(IN_ADDR *)*pHost->h_addr_list) );
  438. return dwIP;
  439. }
  440. // 建立连接(扩展函数)
  441. int TE_ConnectEx(SOCKET hSocket, char const * pszServer, int nPort,DWORD dwTimeout,BOOL fFixNtDNS /*= FALSE*/)
  442. {
  443. /////////////////////////////////////////////////////////////////////////////
  444. SOCKADDR_IN sockAddr;
  445. ZeroMemory(&sockAddr,sizeof(sockAddr));
  446. sockAddr.sin_family = AF_INET;
  447. sockAddr.sin_port = htons((u_short)nPort);
  448. sockAddr.sin_addr.s_addr = TE_GetIP(pszServer,fFixNtDNS);
  449. if (sockAddr.sin_addr.s_addr == INADDR_NONE)
  450. {
  451. TE_SetLastError( WSAGetLastError() );
  452. return (SOCKET_ERROR);
  453. }
  454. //////////////////////////////////////////////////////////////////////
  455. return TE_Connect(hSocket, (SOCKADDR *)&sockAddr,sizeof(sockAddr),dwTimeout);
  456. }
  457. // 绑定套接字
  458. int TE_BindSocket(SOCKET hSocket, const struct sockaddr * SockName, int iNameLen)
  459. {
  460. if (bind(hSocket, SockName, iNameLen) == SOCKET_ERROR)
  461. {
  462. TE_SetLastError( WSAGetLastError() );
  463. return (SOCKET_ERROR);
  464. }
  465. return (SOCKET_SUCCESS);
  466. }
  467. // 绑定套接字
  468. int TE_BindSocketEx(SOCKET hSocket,int nPort)
  469. {
  470. SOCKADDR_IN sockAddr;
  471. ZeroMemory(&sockAddr,sizeof(sockAddr));
  472. sockAddr.sin_family = AF_INET;
  473. sockAddr.sin_addr.s_addr = htonl(INADDR_ANY);
  474. sockAddr.sin_port = htons((u_short)nPort);
  475. return TE_BindSocket(hSocket,(SOCKADDR *)&sockAddr, sizeof(sockAddr));
  476. }
  477. // 监听套接字
  478. int TE_ListenSocket(SOCKET hSocket, int iConnections)
  479. {
  480. if(listen(hSocket, iConnections) == SOCKET_ERROR)
  481. {
  482. TE_SetLastError( WSAGetLastError() );
  483. return (SOCKET_ERROR);
  484. }
  485. return (SOCKET_SUCCESS);
  486. }
  487. // 接受套接字连接
  488. SOCKET TE_Accept(SOCKET hSocket, struct sockaddr * pSocketAddress, int *iNameLen,DWORD dwTimeout)
  489. {
  490. HANDLE hAcceptEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  491. if (hAcceptEvent == NULL)
  492. {
  493. TE_SetLastError( (int)GetLastError() );
  494. return (INVALID_SOCKET);
  495. }
  496. // 注册FD_ACCEPT事件
  497. if( WSAEventSelect(hSocket, (WSAEVENT) hAcceptEvent, FD_ACCEPT) == SOCKET_ERROR)
  498. {
  499. CloseHandle(hAcceptEvent);
  500. TE_SetLastError( WSAGetLastError() );
  501. return (INVALID_SOCKET);
  502. }
  503. SOCKET hSocketAccept = WSAAccept(hSocket, pSocketAddress, iNameLen, NULL, 0);
  504. int    iConnectError = WSAGetLastError();
  505. if ((hSocketAccept == INVALID_SOCKET) && (iConnectError == WSAEWOULDBLOCK))
  506. {
  507. // 阻塞
  508. DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hAcceptEvent, TRUE,dwTimeout, TRUE);
  509. if (dwWaitResult == WSA_WAIT_EVENT_0)
  510. {
  511. ////////////////////////////////////////////////////////////// 
  512. /// 注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该 
  513. /// 进一步检查网络是否发生错误
  514. ///////////////////////////////////////////////////////////////
  515. WSANETWORKEVENTS NetEvent;
  516. if(WSAEnumNetworkEvents(hSocket,hAcceptEvent,&NetEvent) == SOCKET_ERROR)
  517. TE_SetLastError( WSAGetLastError() );
  518. else if(NetEvent.iErrorCode[FD_ACCEPT_BIT] !=0 ) // 发生错误
  519. TE_SetLastError( NetEvent.iErrorCode[FD_ACCEPT_BIT] );
  520. else
  521. hSocketAccept = WSAAccept(hSocket, pSocketAddress, iNameLen, NULL, 0);
  522. }
  523. else
  524. TE_SetLastError( WSAGetLastError() );
  525. }
  526. // 注销网络事件
  527. WSAEventSelect(hSocket, (WSAEVENT) hAcceptEvent, 0);
  528. CloseHandle(hAcceptEvent);
  529. if (hSocketAccept != INVALID_SOCKET)
  530. {
  531. // 设置套接字的属性为地址可重用并且为非阻塞的
  532. if ( (TE_BlockSocket(hSocketAccept, 0)  == SOCKET_ERROR ) ||
  533. (TE_SetSocketOption(hSocketAccept) == SOCKET_ERROR ) )
  534. {
  535. TE_CloseSocket(hSocketAccept,TRUE);
  536. return (INVALID_SOCKET);
  537. }
  538. }
  539. return (hSocketAccept);
  540. }
  541. // 接受套接字连接(允许中断)
  542. SOCKET TE_AcceptEx(SOCKET hSocket, struct sockaddr * pSockName, int *iNameLen,HANDLE hEndEvent,DWORD dwTimeout /*= TE_DEFAULT_TIMEOUT*/)
  543. {
  544. if( hEndEvent == NULL)
  545. return TE_Accept(hSocket,pSockName,iNameLen,dwTimeout);
  546. HANDLE hAcceptEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  547. if (hAcceptEvent == NULL)
  548. {
  549. TE_SetLastError( (int)GetLastError() );
  550. return (INVALID_SOCKET);
  551. }
  552. WSAEVENT hEvent[2]; 
  553. hEvent[0] = (WSAEVENT)hAcceptEvent;
  554. hEvent[1] = (WSAEVENT)hEndEvent;
  555. // 注册FD_ACCEPT事件
  556. if( WSAEventSelect(hSocket, (WSAEVENT) hAcceptEvent, FD_ACCEPT) == SOCKET_ERROR)
  557. {
  558. CloseHandle(hAcceptEvent);
  559. TE_SetLastError( WSAGetLastError() );
  560. return (INVALID_SOCKET);
  561. }
  562. SOCKET hSocketAccept = WSAAccept(hSocket, pSockName, iNameLen, NULL, 0);
  563. int    iConnectError = WSAGetLastError();
  564. if ((hSocketAccept == INVALID_SOCKET) && (iConnectError == WSAEWOULDBLOCK))
  565. {
  566. // 阻塞
  567. DWORD dwWaitResult = WSAWaitForMultipleEvents(2, hEvent, FALSE,dwTimeout, TRUE);
  568. if (dwWaitResult == WSA_WAIT_EVENT_0)
  569. {
  570. ////////////////////////////////////////////////////////////// 
  571. /// 注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该 
  572. /// 进一步检查网络是否发生错误
  573. ///////////////////////////////////////////////////////////////
  574. WSANETWORKEVENTS NetEvent;
  575. if(WSAEnumNetworkEvents(hSocket,hAcceptEvent,&NetEvent) == SOCKET_ERROR)
  576. TE_SetLastError( WSAGetLastError() );
  577. else if(NetEvent.iErrorCode[FD_ACCEPT_BIT] !=0 ) // 发生错误
  578. TE_SetLastError( NetEvent.iErrorCode[FD_ACCEPT_BIT] );
  579. else
  580. hSocketAccept = WSAAccept(hSocket, pSockName, iNameLen, NULL, 0);
  581. }
  582. else
  583. TE_SetLastError( WSAGetLastError() );
  584. }
  585. // 注销网络事件
  586. WSAEventSelect(hSocket, (WSAEVENT) hAcceptEvent, 0);
  587. CloseHandle(hAcceptEvent);
  588. if (hSocketAccept != INVALID_SOCKET)
  589. {
  590. // 设置套接字的属性为地址可重用并且为非阻塞的
  591. if ( (TE_BlockSocket(hSocketAccept, 0) < 0) ||
  592. (TE_SetSocketOption(hSocketAccept) < 0) )
  593. {
  594. TE_CloseSocket(hSocketAccept,TRUE);
  595. return (INVALID_SOCKET);
  596. }
  597. }
  598. return (hSocketAccept);
  599. }
  600. // 设置套接字是否为阻塞的
  601. int      TE_BlockSocket(SOCKET hSocket, BOOL bBlock)
  602. {
  603. u_long  IoctlLong = (bBlock) ? 0 : 1;
  604. if (ioctlsocket(hSocket, FIONBIO, &IoctlLong) == SOCKET_ERROR)
  605. {
  606. TE_SetLastError( WSAGetLastError() );
  607. return (SOCKET_ERROR);
  608.     }
  609. return (SOCKET_SUCCESS);
  610. }
  611. // 数据报接收函数
  612. int TE_RecvDataFrom( SOCKET hSocket, struct sockaddr * pFrom, int iFromlen,
  613.  char *pszBuffer, int iBufferSize, DWORD dwTimeout)
  614. {
  615. HANDLE hReadEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  616. if (hReadEvent == NULL)
  617. {
  618. TE_SetLastError((int)GetLastError() );
  619. return (SOCKET_ERROR);
  620. }
  621. DWORD dwRtxBytes = 0,
  622. dwRtxFlags = 0;
  623. WSABUF WSABuff;
  624. ZeroMemory(&WSABuff,sizeof(WSABUF));
  625. WSABuff.len = iBufferSize;
  626. WSABuff.buf = pszBuffer;
  627. for (;;)
  628. {
  629. // 注册FD_READ事件
  630. if( WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, FD_READ) == SOCKET_ERROR)
  631. {
  632. CloseHandle(hReadEvent);
  633. TE_SetLastError(  WSAGetLastError() );
  634. return (SOCKET_ERROR);
  635. }
  636. DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hReadEvent, TRUE, dwTimeout, TRUE);
  637. if( dwWaitResult != WSA_WAIT_EVENT_0 )
  638. {
  639. // 注销事件
  640. WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
  641. CloseHandle(hReadEvent);
  642. TE_SetLastError( WSAGetLastError());
  643. return (SOCKET_ERROR);
  644. }
  645. ////////////////////////////////////////////////////////////// 
  646. /// 注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该 
  647. /// 进一步检查网络是否发生错误
  648. ///////////////////////////////////////////////////////////////
  649. WSANETWORKEVENTS NetEvent;
  650. if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hReadEvent,&NetEvent) == SOCKET_ERROR)
  651. {
  652. // 注销事件
  653. WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
  654. CloseHandle(hReadEvent);
  655. TE_SetLastError( WSAGetLastError() );
  656. return (SOCKET_ERROR);
  657. }
  658. if(NetEvent.iErrorCode[FD_READ_BIT] !=0 ) // 发生错误
  659. {
  660. // 注销事件
  661. WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
  662. CloseHandle(hReadEvent);
  663. TE_SetLastError(NetEvent.iErrorCode[FD_READ_BIT]);
  664. return (SOCKET_ERROR);
  665. }
  666. ////////////////////////////////////////////////////////////////
  667. // 注销事件
  668. WSAEventSelect(hSocket, (WSAEVENT) hReadEvent, 0);
  669. int FromLen = iFromlen;
  670. if ( WSARecvFrom(hSocket, &WSABuff, 1, &dwRtxBytes, &dwRtxFlags,pFrom, &FromLen, NULL, NULL) == SOCKET_SUCCESS )
  671. break;
  672. if ( WSAGetLastError() != WSAEWOULDBLOCK)
  673. {
  674. CloseHandle(hReadEvent);
  675. TE_SetLastError( WSAGetLastError() );
  676. return (SOCKET_ERROR);
  677. }
  678. ///////////////////////////////////////////////////////////////////////////
  679. // 睡眠一段时间
  680. //////////////////////////////////////////////////////////////////////////
  681. Sleep(TE_BLOCKED_SNDRCV_SLEEP);
  682. }
  683. CloseHandle(hReadEvent);
  684. return ((int) dwRtxBytes);
  685. }
  686. // 数据报发送数据报
  687. int TE_SendDataTo(SOCKET hSocket, const struct sockaddr * pTo,int iToLen,
  688.   char const * pszBuffer, int iBufferSize, DWORD dwTimeout)
  689. {
  690. HANDLE hWriteEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
  691. if (hWriteEvent == NULL)
  692. {
  693. TE_SetLastError( (int)GetLastError() );
  694. return (SOCKET_ERROR);
  695. }
  696. DWORD dwRtxBytes = 0,
  697.             dwRtxFlags = 0;
  698. WSABUF WSABuff;
  699. ZeroMemory(&WSABuff,sizeof(WSABUF));
  700. WSABuff.len = iBufferSize;
  701. WSABuff.buf = (char *) pszBuffer;
  702. for (;;)
  703. {
  704. if (WSASendTo( hSocket, &WSABuff, 1, &dwRtxBytes, dwRtxFlags,pTo, iToLen, NULL, NULL) == SOCKET_SUCCESS)
  705. break;
  706. if (WSAGetLastError() != WSAEWOULDBLOCK)
  707. {
  708. CloseHandle(hWriteEvent);
  709. TE_SetLastError(  WSAGetLastError() );
  710. return (SOCKET_ERROR);
  711. }
  712. //////////////////////////////////////////////////////////////////////////
  713. // 睡眠一段时间
  714. /////////////////////////////////////////////////////////////////////////
  715. Sleep(TE_BLOCKED_SNDRCV_SLEEP);
  716. // 注册FD_WRITE事件  
  717. if( WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, FD_WRITE) == SOCKET_ERROR)
  718. {
  719. CloseHandle(hWriteEvent);
  720. TE_SetLastError( WSAGetLastError() );
  721. return (SOCKET_ERROR);
  722. }
  723. DWORD dwWaitResult = WSAWaitForMultipleEvents(1, &hWriteEvent, TRUE,dwTimeout, TRUE);
  724. if( dwWaitResult != WSA_WAIT_EVENT_0 )
  725. {
  726. // 注销事件
  727. WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
  728. CloseHandle(hWriteEvent);
  729. TE_SetLastError(  WSAGetLastError() );
  730. return (SOCKET_ERROR);
  731. }
  732. ////////////////////////////////////////////////////////////// 
  733. /// 注意:即使 dwWaitResult == WSA_WAIT_EVENT0 ,也应该 
  734. /// 进一步检查网络是否发生错误
  735. ///////////////////////////////////////////////////////////////
  736. WSANETWORKEVENTS NetEvent;
  737. if(WSAEnumNetworkEvents(hSocket,(WSAEVENT)hWriteEvent,&NetEvent) == SOCKET_ERROR)
  738. {
  739. // 注销事件
  740. WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
  741. CloseHandle(hWriteEvent);
  742. TE_SetLastError(  WSAGetLastError() );
  743. return (SOCKET_ERROR);
  744. }
  745. if(NetEvent.iErrorCode[FD_WRITE_BIT] !=0 ) // 发生错误
  746. {
  747. // 注销事件
  748. WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
  749. CloseHandle(hWriteEvent);
  750. TE_SetLastError(NetEvent.iErrorCode[FD_WRITE_BIT]);
  751. return (SOCKET_ERROR);
  752. }
  753. ////////////////////////////////////////////////////////////////
  754. // 注销事件
  755. WSAEventSelect(hSocket, (WSAEVENT) hWriteEvent, 0);
  756. }
  757. CloseHandle(hWriteEvent);
  758. return ((int) dwRtxBytes);
  759. }
  760. ////////////////////////////////////////////////////////////////////////////////
  761. //
  762. // BSocket函数
  763. //
  764. ////////////////////////////////////////////////////////////////////////////////
  765. ///////////////////////////////////////////////////////////////////////////////
  766. //
  767. // 功能: 绑定套接字
  768. // 参数: 
  769. // hSocket -- SOCKET(待绑定套接字)
  770. // iBufferSize -- 缓冲区长度(缺省为TE_SOCKET_BUFFER_SIZE)
  771. // 返回: 
  772. // 结构指针(失败时为NULL)
  773. //
  774. ////////////////////////////////////////////////////////////////////////////////
  775. PBSD TE_BSocketAttach(SOCKET hSocket, int iBufferSize /* = TE_SOCKET_BUFFER_SIZE */ )
  776. {
  777. if( hSocket == INVALID_SOCKET)
  778. return NULL;
  779. // 分配内存
  780. PBSD pBSD = (PBSD) malloc(sizeof(BSD));
  781. if (pBSD == NULL)
  782. return NULL;
  783. char *pszBuffer = (char *) malloc(iBufferSize);
  784. if (pszBuffer == NULL)
  785. {
  786. free(pBSD);
  787. return NULL;
  788. }
  789. // 设置结构成员
  790. ZeroMemory(pBSD,sizeof(BSD));
  791. ZeroMemory(pszBuffer,iBufferSize);
  792. pBSD->hSocket = hSocket;
  793. pBSD->iBufferSize = iBufferSize;
  794. pBSD->pszBuffer = pszBuffer;
  795. pBSD->iBytesInBuffer = 0;
  796. pBSD->iReadIndex = 0;
  797. pBSD->iBufferIndex = 0;
  798. return pBSD;
  799. }
  800. ////////////////////////////////////////////////////////////////////////////
  801. //
  802. // 功能: 解开套接字
  803. // 参数: 
  804. // pBSD -- BufSocketData结构指针
  805. // bCloseSocket -- 是否在解开套接字同时关闭套接字(缺省为FALSE)
  806. // 返回: 
  807. // 若bCloseSocket为FALSE,返回解开的套接字
  808. // 若bCloseSocket为TRUE ,返回INVALID_SOCKET
  809. //
  810. ///////////////////////////////////////////////////////////////////////////
  811. SOCKET TE_BSocketDetach(PBSD pBSD, BOOL bCloseSocket /* = FALSE */ )
  812. {
  813. SOCKET  hSocket = pBSD->hSocket;
  814. // 释放内存
  815. free(pBSD->pszBuffer);
  816. free(pBSD);
  817. // 是否关闭套接字
  818. if (bCloseSocket)
  819. {
  820. TE_CloseSocket(hSocket);
  821. return (INVALID_SOCKET);
  822. }
  823. return (hSocket);
  824. }
  825. ////////////////////////////////////////////////////////////////////
  826. //
  827. // 功能: 从缓冲区读取数据
  828. // 参数: 
  829. // pBSD  -- BufSocketData结构指针
  830. // dwTimeOut  -- 接收超时(缺省为TE_RECV_TIMEOUT)
  831. // 返回: 
  832. //  0 --- 成功 (SOCKET_SUCCESS)
  833. // -1 --- 失败 (SOCKET_ERROR)
  834. //
  835. ////////////////////////////////////////////////////////////////////
  836. int TE_BSocketReadData(PBSD pBSD, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
  837. {
  838. // 计算缓冲区空闲区域
  839. int iMaxRead = pBSD->iBufferSize - pBSD->iBytesInBuffer;
  840. char  *pszBuffer = (char *) malloc(iMaxRead + 1);
  841. if (pszBuffer == NULL)
  842. return (SOCKET_ERROR);
  843. // 清空
  844. ZeroMemory(pszBuffer,iMaxRead+1);
  845. // 接收数据
  846. int iReadedBytes = TE_RecvData(pBSD->hSocket, pszBuffer, iMaxRead, dwTimeout);
  847. if (iReadedBytes > 0)
  848. {
  849. int iHeadSize = Min(pBSD->iBufferSize - pBSD->iBufferIndex, iReadedBytes);
  850. if (iHeadSize > 0)
  851. memcpy(pBSD->pszBuffer + pBSD->iBufferIndex, pszBuffer, iHeadSize);
  852. pBSD->iBufferIndex += iHeadSize;
  853. if (pBSD->iBufferIndex == pBSD->iBufferSize)
  854. pBSD->iBufferIndex = 0;
  855. int iBackSize = iReadedBytes - iHeadSize;
  856. if (iBackSize > 0)
  857. memcpy(pBSD->pszBuffer + pBSD->iBufferIndex, pszBuffer + iHeadSize, iBackSize);
  858. pBSD->iBufferIndex += iBackSize;
  859. pBSD->iBytesInBuffer += iReadedBytes;
  860. }
  861. free(pszBuffer);
  862. return (iReadedBytes);
  863. }
  864. ////////////////////////////////////////////////////////////////////
  865. //
  866. // 功能: 从缓冲区读取一个字符
  867. // 参数: 
  868. // pBSD  -- BufSocketData结构指针
  869. // dwTimeOut -- 接收超时(缺省为TE_RECV_TIMEOUT)
  870. // 返回: 
  871. // 一个字符(错误时返回TE_EOF)
  872. //
  873. ////////////////////////////////////////////////////////////////////
  874. int TE_BSocketGetChar(PBSD pBSD, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
  875. {
  876. if ((pBSD->iBytesInBuffer == 0) && (TE_BSocketReadData(pBSD, dwTimeout) <= 0))
  877. return (TE_EOF);
  878. int iChar =( (int) pBSD->pszBuffer[pBSD->iReadIndex]) & 0x000000ff;
  879. pBSD->iReadIndex = INext(pBSD->iReadIndex, pBSD->iBufferSize);
  880. --pBSD->iBytesInBuffer;
  881. return (iChar);
  882. }
  883. ////////////////////////////////////////////////////////////////////////////
  884. //
  885. // 功能: 从缓冲区读取一行(注意,结尾的回车换行0x0D,0x0A并不包括在其中)
  886. // 参数: 
  887. // pBSD  -- BufSocketData结构指针
  888. // pszBuffer  -- 接收缓冲区
  889. // iBufferSize  -- 缓冲大小
  890. // iStatus  -- 状态 (0:正常,1:缓冲不够,-1:错误)
  891. // dwTimeOut  -- 接收超时(缺省为TE_RECV_TIMEOUT)
  892. // 返回: 
  893. //  0 --- 成功 (SOCKET_SUCCESS)
  894. // -1 --- 失败 (SOCKET_ERROR)
  895. //
  896. ////////////////////////////////////////////////////////////////////////////
  897. int TE_BSocketGetString(PBSD pBSD, char *pszBuffer, int iBufferSize, int* iStatus, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
  898. {
  899. *iStatus = 1; //缓冲长度不足
  900. int ii,iChar;
  901. for (ii = 0; ii < (iBufferSize - 1);)
  902. {
  903. iChar = TE_BSocketGetChar(pBSD, dwTimeout);
  904. if (iChar == TE_EOF)
  905. {
  906. *iStatus = (-1) ;
  907. return SOCKET_ERROR;
  908. }
  909. if (iChar == 0x0D) // 回车符号
  910. {
  911. iChar = TE_BSocketGetChar(pBSD, dwTimeout);
  912. if (iChar == TE_EOF)
  913. {
  914. *iStatus = (-1);
  915. return (SOCKET_ERROR);
  916. }
  917. if (iChar == 0x0A) // 换行
  918. {
  919. *iStatus = 0; //正常情况
  920. break;
  921. }
  922. else
  923. pszBuffer[ii++] = 0x0D;
  924. }
  925. else
  926. pszBuffer[ii++] = (char) iChar;
  927. }
  928. pszBuffer[ii] = '';
  929. return (SOCKET_SUCCESS);
  930. }
  931. /////////////////////////////////////////////////////////////////////////////////////////
  932. //
  933. // 功能: 从缓冲区读取一行(包括单换行0x0A)(注意,结尾的回车换行不包括在其中)
  934. // 参数: 
  935. // pBSD -- BufSocketData结构指针
  936. // pszBuffer  -- 接收缓冲区
  937. // iBufferSize  -- 缓冲大小
  938. // iStatus -- 状态 (0:正常,1:缓冲不够,-1:错误)
  939. // dwTimeOut -- 接收超时(缺省为TE_RECV_TIMEOUT)
  940. // 返回: 
  941. //  0 --- 成功 (SOCKET_SUCCESS)
  942. // -1 --- 失败 (SOCKET_ERROR)
  943. //
  944. //////////////////////////////////////////////////////////////////////////////////////////
  945. int TE_BSocketGetStringEx(PBSD pBSD, char *pszBuffer, int iBufferSize, int* iStatus, DWORD dwTimeout /* = TE_RECV_TIMEOUT */ )
  946. {
  947. *iStatus = 1; //缓冲长度不足
  948. int ii,iChar;
  949. int LastChar = TE_EOF;
  950. for (ii = 0; ii < (iBufferSize - 1);)
  951. {
  952. iChar = TE_BSocketGetChar(pBSD, dwTimeout);
  953. if (iChar == TE_EOF)
  954. {
  955. *iStatus = (-1) ;
  956. return SOCKET_ERROR;
  957. }
  958. if (iChar == 0x0A) // 换行符号
  959. {
  960. *iStatus = 0; //正常情况
  961. if (LastChar == 0x0D)
  962. ii-- ;
  963. break;
  964. }
  965. else
  966. pszBuffer[ii++] = (char) iChar;
  967. LastChar = iChar;
  968. }
  969. pszBuffer[ii] = '';
  970. return (SOCKET_SUCCESS);
  971. }
  972. ////////////////////////////////////////////////////////////////////
  973. //
  974. // 功能: 发送一行 : 自动在最后加上“回车换行符(0x0D,0x0A)”
  975. // 参数: 
  976. // pBSD -- BufSocketData结构指针
  977. // pszBuffer -- 待发送字符串
  978. // dwTimeOut -- 发送超时(缺省为TE_SEND_TIMEOUT)
  979. // 返回: 
  980. //  0 --- 成功 (SOCKET_SUCCESS)
  981. // -1 --- 失败 (SOCKET_ERROR)
  982. //
  983. ////////////////////////////////////////////////////////////////////
  984. int TE_BSocketSendString(PBSD pBSD, const char *pszBuffer, DWORD dwTimeout /* = TE_SEND_TIMEOUT */ )
  985. {
  986. char *pszSendBuffer = (char *) malloc(strlen(pszBuffer) + 3);
  987. if (pszSendBuffer == NULL)
  988. return (SOCKET_ERROR);
  989. ZeroMemory( pszSendBuffer,strlen(pszBuffer) + 3);
  990. sprintf(pszSendBuffer, "%srn", pszBuffer);
  991. int iSendLength = strlen(pszSendBuffer);
  992. if (TE_Send(pBSD->hSocket, pszSendBuffer, iSendLength, dwTimeout) != iSendLength)
  993. {
  994.         free(pszSendBuffer);
  995. return (SOCKET_ERROR);
  996.     }
  997. free(pszSendBuffer);
  998. return (iSendLength);
  999. }
  1000. ////////////////////////////////////////////////////////////////////
  1001. //
  1002. // 功能: 获取套接字
  1003. // 参数: 
  1004. // pBSD -- BufSocketData结构指针
  1005. // 返回: 
  1006. // 与此结构绑定在一起的SOCKET
  1007. //
  1008. ////////////////////////////////////////////////////////////////////
  1009. SOCKET TE_BSocketGetAttachedSocket(PBSD pBSD)
  1010. {
  1011. return (pBSD->hSocket);
  1012. }
  1013. ////////////////////////////////////////////////////////////////////
  1014. //
  1015. // 功能: 从缓冲区读取一定数量的数据
  1016. // 参数: 
  1017. // pBSD  -- BufSocketData结构指针
  1018. // pszBuffer  -- 接收缓冲区
  1019. // iBufferSize  -- 缓冲大小
  1020. // dwTimeOut  -- 接收超时(缺省为TE_RECV_TIMEOUT)
  1021. // 返回: 
  1022. // 读的数据的字节数
  1023. ////////////////////////////////////////////////////////////////////
  1024. int TE_BSocketGetData(PBSD pBSD, char *pszBuffer, int iBufferSize,DWORD dwTimeout /*= TE_RECV_TIMEOUT*/)
  1025. {
  1026. int iReadBytes  = 0;
  1027. int iHeadSize,iBackSize;
  1028. if ((pBSD->iBytesInBuffer == 0) && (TE_BSocketReadData(pBSD, dwTimeout) <= 0))
  1029. return 0; 
  1030. if( pBSD->iBytesInBuffer < iBufferSize ) // 数据不够多
  1031. {
  1032. iHeadSize = Min( pBSD->iBufferSize - pBSD->iReadIndex ,pBSD->iBytesInBuffer );
  1033. memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iHeadSize);
  1034. pBSD->iReadIndex += iHeadSize;
  1035. if( pBSD->iReadIndex == pBSD->iBufferSize )
  1036. pBSD->iReadIndex = 0;
  1037. iReadBytes += iHeadSize;
  1038. iBackSize = pBSD->iBytesInBuffer - iHeadSize;
  1039. if( iBackSize > 0)
  1040. memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iBackSize);
  1041. iReadBytes  += iBackSize;
  1042. pBSD->iReadIndex  += iBackSize;
  1043. pBSD->iBytesInBuffer = 0; // 数据全部读完
  1044. }
  1045. else // 这次的数据足够多了
  1046. {
  1047. iHeadSize = Min( pBSD->iBufferSize - pBSD->iReadIndex,iBufferSize - iReadBytes );
  1048. memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iHeadSize);
  1049. pBSD->iReadIndex += iHeadSize;
  1050. if( pBSD->iReadIndex == pBSD->iBufferSize )
  1051. pBSD->iReadIndex = 0;
  1052. iReadBytes += iHeadSize;
  1053. iBackSize = iBufferSize - iReadBytes;
  1054. if( iBackSize > 0)
  1055. memcpy(pszBuffer+iReadBytes,pBSD->pszBuffer+pBSD->iReadIndex,iBackSize);
  1056. iReadBytes  += iBackSize;
  1057. pBSD->iReadIndex  += iBackSize;
  1058. pBSD->iBytesInBuffer -= (iHeadSize+iBackSize);
  1059. }
  1060. return iReadBytes;
  1061. }