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