Link.cpp
上传用户:may_xy
上传日期:2007-08-09
资源大小:1519k
文件大小:4k
源码类别:

游戏

开发平台:

C/C++

  1. // Link.cpp: implementation of the CLink class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #include "stdafx.h"
  5. #include "斗地主.h"
  6. #include "Link.h"
  7. #ifdef _DEBUG
  8. #undef THIS_FILE
  9. static char THIS_FILE[]=__FILE__;
  10. #define new DEBUG_NEW
  11. #endif
  12. //////////////////////////////////////////////////////////////////////
  13. // Construction/Destruction
  14. //////////////////////////////////////////////////////////////////////
  15. CLink::CLink()
  16. {
  17. m_hSocket = NULL;
  18. m_nPort = 6666;
  19. }
  20. CLink::~CLink()
  21. {
  22. }
  23. //得到本机名和IP地址;
  24. int CLink::GetHostIP()
  25. {
  26. char szhostname[128];
  27.     CString str;
  28. //得到本机名和IP地址:
  29. if( gethostname(szhostname, 128) == 0 )
  30. {
  31. // get host adresses
  32. struct hostent * phost;
  33. int i;
  34.  
  35. phost = gethostbyname(szhostname);
  36.         m_szHostname = szhostname;
  37. i=0;
  38.   int j;
  39.         int h_length=4;
  40.   for( j = 0; j<h_length; j++ )
  41.   {
  42. CString addr;
  43.  
  44.   if( j > 0 )
  45.   str += ".";
  46.  
  47.   addr.Format("%u", (unsigned int)((unsigned
  48.   char*)phost->h_addr_list[i])[j]);
  49. str += addr;
  50. }  //end for~
  51. }
  52.     m_szIpaddress = str;
  53. return 1;
  54. }
  55. //初始化静态变量;
  56. CString CLink::m_szHostname = _T("");
  57. CString CLink::m_szIpaddress = _T("");
  58. //建立一个服务器端socket;
  59. void CLink::SocketInit()
  60. {
  61. //建立winsock联接
  62. CString str;
  63. WSADATA wsd;   //相关信息;
  64. if (WSAStartup(MAKEWORD(2,2), &wsd) != 0) 
  65. {
  66. AfxMessageBox("WSAStartup() failed !n");
  67. }
  68. }
  69. //创建一个套接字;
  70. void CLink::Create()
  71. { /* 创建套接字 */
  72. m_hSocket = socket(AF_INET, SOCK_STREAM, 0);
  73. if (m_hSocket == INVALID_SOCKET)
  74. {
  75. CString str;
  76. str.Format("m_hSocket 初始化失败: %dn", WSAGetLastError() );
  77. AfxMessageBox(str);
  78. }
  79. }
  80. //关闭一个套接字;
  81. void CLink::Close()
  82. {
  83. if(m_hSocket != NULL)
  84. {
  85. if( closesocket(m_hSocket) == SOCKET_ERROR )
  86. {
  87. AfxMessageBox("关闭错误!");
  88. }
  89. }
  90. }
  91. //套接字绑定;
  92. void CLink::Bind()
  93. {
  94. struct sockaddr_in sa;
  95. /* 填充服务器地址结构 */
  96. memset(&sa, 0, sizeof(sa));
  97. sa.sin_family = AF_INET;
  98. sa.sin_port = htons(m_nPort);
  99. sa.sin_addr.S_un.S_addr = htonl(INADDR_ANY);
  100. /* 绑定套接字到服务器地址结构 */
  101. if ( bind(m_hSocket, (const sockaddr *)&sa,sizeof(sa)) != 0 )
  102. {
  103. CString str;
  104. str.Format("Bind() failed: %dn", WSAGetLastError() );
  105. AfxMessageBox(str);
  106. }
  107. }
  108. //侦听
  109. void CLink::Listen()
  110. {
  111. /* 监听套接字 */
  112. if( m_hSocket != NULL )
  113. {
  114. if( listen(m_hSocket,5) == SOCKET_ERROR )
  115. {
  116. CString str;
  117. str.Format("Listen() failed: %dn", WSAGetLastError() );
  118. AfxMessageBox(str);
  119. }
  120. }
  121. }
  122. //接收客户;
  123. void CLink::Accept(CLink* pServer_Link)
  124. {
  125. struct sockaddr_in cliaddr;
  126. int len = sizeof(SOCKADDR);
  127. pServer_Link->m_hSocket = accept(m_hSocket, (struct sockaddr *)&cliaddr, &len);
  128. if ( pServer_Link->m_hSocket == INVALID_SOCKET )
  129. {
  130. CString str;
  131. str.Format("Accept() failed: %dn", WSAGetLastError() );
  132. AfxMessageBox(str);
  133. closesocket(m_hSocket);
  134. }
  135. }
  136. //连接请求;
  137. int CLink::Connect(CString addr)
  138. {
  139. unsigned long Server_Addr; /* 转换后的服务器地址 */
  140. struct sockaddr_in sa;
  141. Server_Addr = inet_addr(addr);
  142. memset(&sa, 0, sizeof(sa));
  143. sa.sin_family = AF_INET;
  144. sa.sin_port = htons(m_nPort);
  145. sa.sin_addr.S_un.S_addr = Server_Addr;
  146. //客户端无须绑定;
  147. if( connect(m_hSocket, (const sockaddr *)&sa,sizeof(sa)) != NULL )
  148. {
  149. CString str;
  150. str.Format("Connect() failed: %dn", WSAGetLastError() );
  151. AfxMessageBox(str);
  152. return 0;
  153. }
  154. return 1;
  155. }
  156. //发送数据;
  157. int CLink::Send(void* pbuffer,int nSize)
  158. {
  159. int nBytesSent;
  160. if( (nBytesSent = send(m_hSocket,(const char*)pbuffer,nSize,0)) == SOCKET_ERROR )
  161. {
  162. AfxMessageBox("发送错误,有可能是其他玩家已经退出游戏!n游戏结束!");
  163. Close();
  164. ::ExitProcess(NULL);
  165. return SOCKET_ERROR;
  166. }
  167. return nBytesSent;
  168. }
  169. //接收数据;
  170. int CLink::Recv(void* pbuffer,int nSize)
  171. {
  172. int nBytesReceive;
  173. if( (nBytesReceive = recv(m_hSocket,(char*)pbuffer,nSize,0)) == SOCKET_ERROR )
  174. {
  175. AfxMessageBox("接收错误,有可能是其他玩家已经退出游戏!n游戏结束!");
  176. Close();
  177. ::ExitProcess(NULL);
  178. return SOCKET_ERROR;
  179. }
  180. return nBytesReceive;
  181. }