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

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. #ifndef __TE__SOCKET__H__INCLUDED__
  30. #define __TE__SOCKET__H__INCLUDED__
  31. #include <winsock2.h> // Winsock2
  32. #include <stdio.h>
  33. //宏
  34. #define Min(a, b)               (((a) < (b)) ? (a): (b))
  35. #define Max(a, b)               (((a) > (b)) ? (a): (b))
  36. #define INext(i, n)             ((((i) + 1) < (n)) ? ((i) + 1): 0)
  37. #define IPrev(i, n)             (((i) > 0) ? ((i) - 1): ((n) - 1))
  38. // 常量定义
  39. const int TE_SOCKET_BUFFER_SIZE = 4096;// 缓冲区缺省大小
  40. const int TE_EOF = 0x100;// 无效接收字符
  41. const int SOCKET_SUCCESS = 0;
  42. const int TE_SOCKET_MAJOR_VERSION = 2;
  43. const int TE_SOCKET_MINOR_VERSION = 2;
  44. // 缺省超时参数 (超时单位:毫秒 )
  45. const DWORD TE_SHUTDOWN_RECV_TIMEOUT = 4*1000;  // 优雅关闭时延迟4秒
  46. const DWORD TE_BLOCKED_SNDRCV_SLEEP = 100;    // 100毫秒(发生阻塞时等待[睡眠]时间)
  47. const DWORD TE_DEFAULT_TIMEOUT = 120*1000;// 120秒 缺省超时
  48. const DWORD TE_CONNECT_TIMEOUT = 120*1000;// 120秒 连接超时
  49. const DWORD TE_SEND_TIMEOUT = 120*1000;// 120秒 发送超时
  50. const DWORD TE_RECV_TIMEOUT = 120*1000;// 120秒 接收超时 
  51. // 数据结构(缓冲区循环使用)
  52. typedef struct _tagBufSocketData
  53. {
  54.     SOCKET hSocket; // SOCKET
  55.     int             iBufferSize; // 数据缓冲大小
  56.     char*           pszBuffer; // 数据缓冲
  57.     int             iBytesInBuffer; // 缓冲区已有数据长度(字节)
  58.     int             iReadIndex; // 可以读取的下一缓冲区位置
  59.     int             iBufferIndex; // 可以使用的下一缓冲区位置
  60. }BSD,*PBSD;
  61. // 获取及设置错误/内存管理辅助函数
  62. int TE_GetLastError(void);
  63. void TE_SetLastError(int iErrorCode);
  64. // SOCKET函数 (基于Winsock2)
  65. int TE_InitLibrary();
  66. void TE_CleanupLibrary();
  67. SOCKET TE_CreateSocket(int iAddressFamily = AF_INET, 
  68. int iType        = SOCK_STREAM, 
  69. int iProtocol    = 0);
  70. void TE_CloseSocket(SOCKET hSocket, BOOL bHardClose = FALSE);
  71. int     TE_SetSocketOption(SOCKET hSocket);
  72. int     TE_RecvLL(SOCKET hSocket, char *pszBuffer, int iBufferSize);
  73. int TE_RecvData(SOCKET hSocket, char *pszBuffer, int iBufferSize, DWORD dwTimeout = TE_RECV_TIMEOUT);
  74. int TE_Recv(SOCKET hSocket, char *pszBuffer, int iBufferSize, DWORD dwTimeout = TE_RECV_TIMEOUT);
  75. int     TE_SendLL(SOCKET hSocket, char const * pszBuffer, int iBufferSize);
  76. int TE_SendData(SOCKET hSocket, char const * pszBuffer, int iBufferSize, DWORD dwTimeout = TE_SEND_TIMEOUT);
  77. int TE_Send(SOCKET hSocket, char const * pszBuffer, int iBufferSize, DWORD dwTimeout = TE_SEND_TIMEOUT);
  78. int TE_Connect(SOCKET hSocket, const struct sockaddr * pSockName, int iNameLen,DWORD dwTimeout = TE_CONNECT_TIMEOUT);
  79. int TE_BindSocket(SOCKET hSocket, const struct sockaddr * SockName, int iNameLen);
  80. int TE_ListenSocket(SOCKET hSocket, int iConnections);
  81. SOCKET TE_Accept(SOCKET hSocket, struct sockaddr * pSockName, int *iNameLen,DWORD dwTimeout = TE_DEFAULT_TIMEOUT);
  82. SOCKET TE_AcceptEx(SOCKET hSocket, struct sockaddr * pSockName, int *iNameLen,HANDLE hEndEvent,DWORD dwTimeout = TE_DEFAULT_TIMEOUT);
  83. int     TE_BlockSocket(SOCKET hSocket, BOOL bBlock);
  84. int TE_RecvDataFrom(SOCKET hSocket, struct sockaddr * pFrom, int iFromlen,
  85. char *pszBuffer, int iBufferSize, DWORD dwTimeout = TE_RECV_TIMEOUT);
  86. int TE_SendDataTo(SOCKET hSocket, const struct sockaddr * pTo,int iToLen,
  87.   char const * pszBuffer, int iBufferSize, DWORD dwTimeout = TE_RECV_TIMEOUT);
  88. // 扩展函数
  89. int TE_BindSocketEx(SOCKET hSocket,int nPort);
  90. int TE_ConnectEx(SOCKET hSocket, char const * pServer, int nPort,DWORD dwTimeout = TE_CONNECT_TIMEOUT,BOOL fFixNtDNS = FALSE);
  91. // BufSocket函数
  92. PBSD TE_BSocketAttach(SOCKET hSocket, int iBufferSize = TE_SOCKET_BUFFER_SIZE);
  93. SOCKET TE_BSocketDetach(PBSD pBSD,  BOOL bCloseSocket = FALSE);
  94. int TE_BSocketReadData(PBSD pBSD, DWORD dwTimeout = TE_RECV_TIMEOUT);
  95. int TE_BSocketGetChar(PBSD pBSD, DWORD dwTimeout = TE_RECV_TIMEOUT);
  96. int TE_BSocketGetString(PBSD pBSD, char *pszBuffer, int iBufferSize,int* iStatus, DWORD dwTimeout = TE_RECV_TIMEOUT);
  97. int TE_BSocketSendString(PBSD pBSD, const char *pszBuffer, DWORD dwTimeout = TE_SEND_TIMEOUT);
  98. SOCKET TE_BSocketGetAttachedSocket(PBSD pBSD);
  99. int TE_BSocketGetStringEx(PBSD pBSD, char *pszBuffer, int iBufferSize, int* iStatus, DWORD dwTimeout = TE_RECV_TIMEOUT);
  100. int TE_BSocketGetData(PBSD pBSD, char *pszBuffer, int iBufferSize,DWORD dwTimeout = TE_RECV_TIMEOUT);
  101. // 其他
  102. DWORD TE_GetIP(const char* name,BOOL fFixNtDNS  = FALSE); // Used to Fix NT DNS Problem
  103. #endif //__TE__SOCKET__H__INCLUDED__