BvSocket.cpp
上传用户:onsales
上传日期:2010-01-31
资源大小:224k
文件大小:6k
源码类别:

网络编程

开发平台:

Visual C++

  1. // BvSocket.cpp: implementation of the CBvSocket class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "Speak.h"
  6. #include "BvSocket.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. #pragma comment(lib, "wsock32")
  13. //////////////////////////////////////////////////////////////////////
  14. // Construction/Destruction
  15. //////////////////////////////////////////////////////////////////////
  16. CBvSocket::CBvSocket()
  17. {
  18. }
  19. CBvSocket::~CBvSocket()
  20. {
  21. }
  22. void CBvSocket::ReportWinsockErr(LPSTR lpszErrorMsg)
  23. {
  24. char chMsgBuffer[100];
  25. wsprintf(chMsgBuffer, "nWinsock error %d: %snn", WSAGetLastError(), lpszErrorMsg);
  26. MessageBox(NULL,chMsgBuffer,  AfxGetAppName(), MB_OK|MB_ICONSTOP);
  27. return;   
  28. }
  29. BOOL CBvSocket::Init(WSADATA* wsaData)
  30. {
  31. if (WSAStartup(WINSOCK_VERSION,wsaData))
  32. {
  33. MessageBeep(MB_ICONSTOP);
  34. MessageBox(NULL,"Winsock could not be initialized!", AfxGetAppName(), MB_OK|MB_ICONSTOP);
  35.     WSACleanup();
  36.     return(FALSE);
  37. }                  
  38. return TRUE;
  39. }
  40. BOOL CBvSocket::Clean()
  41. {
  42. int iErrorCode;
  43. char chMsgBuffer[100];
  44. if ((iErrorCode = WSACleanup()))
  45. {
  46. wsprintf(chMsgBuffer, "Winsock error %d.", iErrorCode);
  47. MessageBeep(MB_ICONSTOP);
  48. MessageBox(NULL, chMsgBuffer,  AfxGetAppName(), MB_OK|MB_ICONSTOP);   
  49. return FALSE;
  50.     }
  51. return TRUE;
  52. }
  53. BOOL CBvSocket::GetHostName(char *name, int namelen)
  54. //determine if the local machine is on_line!
  55. {
  56. if (gethostname(name, namelen))
  57. {
  58. ReportWinsockErr("nCould not resolve local host!nAre you on-line?n");
  59. return FALSE;
  60. }
  61. return TRUE;
  62. }
  63. BOOL CBvSocket::Create()
  64. //Create the default socket for general use!
  65. {
  66. m_hSocket=socket(PF_INET, SOCK_STREAM, 0);
  67. if (m_hSocket == INVALID_SOCKET)
  68. {
  69. ReportWinsockErr("Could not create server socket.");
  70. return FALSE;
  71. }
  72. return TRUE;
  73. }
  74. BOOL CBvSocket::Create(int af, int type, int protocol)
  75. //you can create the socket using the socket,there is equal!
  76. {
  77. m_hSocket=socket(af,type,protocol);
  78. if (m_hSocket == INVALID_SOCKET)
  79. {
  80. ReportWinsockErr("Could not create server socket.");
  81. return FALSE;
  82. }
  83. return TRUE;
  84. }
  85. void CBvSocket::SetAddrIn(const char FAR* ip, unsigned short port)
  86. //you can set you socket address using the doted string format.
  87. {
  88. m_addrSocket.sin_family=AF_INET;
  89. m_addrSocket.sin_addr.S_un.S_addr=inet_addr(ip);
  90. m_addrSocket.sin_port=htons(port);
  91. }
  92. void CBvSocket::SetAddrIn(unsigned short port)
  93. //you can also let the windows to process the ip,if your machine have
  94. //more than one ip.
  95. {
  96. m_addrSocket.sin_family=AF_INET;
  97. m_addrSocket.sin_addr.S_un.S_addr=INADDR_ANY;
  98. m_addrSocket.sin_port=htons(port);
  99. }
  100. BOOL CBvSocket::Bind()
  101. //if you have used SetAddrIn() create the socket address,you can call
  102. //this default bind function to name the unnamed socket address.
  103. {
  104. if (bind(m_hSocket,(LPSOCKADDR)&m_addrSocket,sizeof(m_addrSocket)) == SOCKET_ERROR)
  105. {
  106. ReportWinsockErr("Could not bind server socket.");
  107. return FALSE;
  108.  }
  109. return TRUE;
  110. }
  111. BOOL CBvSocket::Bind(unsigned short port)
  112. //you can also combine setaddrin() and bind() in one function.
  113. {
  114. SetAddrIn(port);
  115. return Bind();
  116. }
  117. BOOL CBvSocket::Bind(const char *ip, unsigned short port)
  118. //you can also combine setaddrin() and bind() in one function.
  119. //see the description of the SetAddrIn(const char *ip, unsigned short port).
  120. {
  121. SetAddrIn(ip,port);
  122. return Bind();
  123. }
  124. BOOL CBvSocket::AsyncSelect(HWND hWnd, unsigned int wMsg, long lEvent)
  125. //This function is just to call the WSAAsyncSelect(...)function,
  126. //wMsg is the user defined Message constant,
  127. //for more information, you can look the MSDN,you also can read a example project.
  128. {
  129. int iErrorCode = WSAAsyncSelect(m_hSocket, hWnd, wMsg,lEvent);
  130. if (iErrorCode == SOCKET_ERROR) 
  131. {
  132. ReportWinsockErr("WSAAsyncSelect failed on server socket.");
  133. return FALSE;
  134. }
  135. return TRUE;
  136. }
  137. BOOL CBvSocket::Listen()
  138. //just the simple call listen
  139. {
  140. if (listen(m_hSocket, 5) == SOCKET_ERROR)
  141. {
  142. ReportWinsockErr("Server socket failed to listen.");
  143. return FALSE;
  144. }
  145. return TRUE;
  146. }
  147. BOOL CBvSocket::Listen(int queue_size)
  148. //you can set the queue size,using this function.
  149. {
  150. if (listen(m_hSocket, queue_size) == SOCKET_ERROR)
  151. {
  152. ReportWinsockErr("Server socket failed to listen.");
  153. return FALSE;
  154. }
  155. return TRUE;
  156. }
  157. BOOL CBvSocket::Listen(int queue_size,HWND hWnd, unsigned int wMsg)
  158. {
  159. if(!WSAAsyncSelect(m_hSocket,hWnd,wMsg,FD_ACCEPT))
  160. return FALSE;
  161. if(!Listen(queue_size))
  162. return FALSE;
  163. return TRUE;
  164. }
  165. BOOL CBvSocket::EndListen()
  166. {
  167. Close();
  168. return TRUE;
  169. }
  170. BOOL CBvSocket::Close()
  171. {
  172. return closesocket(m_hSocket);
  173. }
  174. int CBvSocket::Recieve(char *buf, int len, int flags=0)
  175. {
  176. return recv(m_hSocket,buf,len,flags);
  177. }
  178. int CBvSocket::Send(const char *buf, int len, int flags=0)
  179. {
  180. return send(m_hSocket,buf,len,flags);
  181. }
  182. int CBvSocket::Connect()
  183. {
  184. return connect(m_hSocket,(LPSOCKADDR)&m_addrSocket,sizeof(m_addrSocket));
  185. }
  186. int CBvSocket::SetSocketOpt(int optname, const char *optval, 
  187. int optlen, int level=SOL_SOCKET)
  188. //for more information you can see the msdn.
  189. {
  190. return setsockopt(m_hSocket,level,optname,optval,optlen);
  191. }
  192. int CBvSocket::GetSocketOpt(int optname, char *optval,
  193. int *optlen, int level=SOL_SOCKET)
  194. {
  195. return getsockopt(m_hSocket,level,optname,optval,optlen);
  196. }
  197. SOCKET CBvSocket::Accept(SOCKADDR *addr, int *addrlen)
  198. {
  199. return accept(m_hSocket,addr,addrlen);
  200. }
  201. int CBvSocket::Connect(const char FAR* ip, unsigned short port)
  202. {
  203. SetAddrIn(ip,port);
  204. return Connect();
  205. }
  206. BOOL CBvSocket::SetAddrIn(long ip, unsigned short port)
  207. {
  208. return TRUE;
  209. }