Server.cpp
Upload User: whzytd4
Upload Date: 2022-08-01
Package Size: 7346k
Code Size: 4k
Category:

WinSock-NDIS

Development Platform:

Visual C++

  1. // Server.cpp : Defines the entry point for the console application.
  2. //
  3. #include "stdafx.h"
  4. #include <iostream.h>
  5. #include "winsock2.h"
  6. #pragma comment(lib, "WS2_32.lib")
  7. #define SERVER_DLL_ERROR 1
  8. #define MAX_NUM_BUF 128
  9. #define SERVER_API_ERROR 2 //调用Windows sockets API失败
  10. #define SERVERPORT 5500
  11. SOCKET sServer;
  12. SOCKET sClient;
  13. char bufRecv[MAX_NUM_BUF];
  14. char bufSend[MAX_NUM_BUF];
  15. bool bConning;
  16. WORD wVersionRequested;
  17. int retVal;
  18. WSADATA wsd;
  19. void InitMember(void);
  20. void ShowSocketMsg(char* str);
  21. int  HandleSocketError(char *str);
  22. bool RecvLine(SOCKET s, char* buf);
  23. bool SendLine(SOCKET s, char* str);
  24. int ExitClient(int Exit);
  25. void InitMember(void)
  26. {
  27. memset(bufRecv, 0, MAX_NUM_BUF);
  28. memset(bufSend, 0, MAX_NUM_BUF);
  29. sServer = INVALID_SOCKET;
  30. sClient = INVALID_SOCKET;
  31. bConning = false;
  32. }
  33. void ShowSocketMsg(char* str)
  34. {
  35. MessageBox(NULL, str, "SERVER ERROR", MB_OK);
  36. }
  37. int HandleSocketError(char *str)
  38. {
  39. ShowSocketMsg(str);
  40. WSACleanup();
  41. return SERVER_API_ERROR;
  42. }
  43. bool RecvLine(SOCKET s, char* buf)
  44. {
  45. bool retVal = TRUE;
  46. BOOL bLineEnd = false;
  47. int nReadLen = 0;
  48. int nDataLen = 0;
  49. while(!bLineEnd && bConning)
  50. {
  51. nReadLen = recv(sServer, buf+nDataLen, 1, 0);
  52. if(SOCKET_ERROR == nReadLen)
  53. {
  54. retVal = false;
  55. break;
  56. }
  57. if(nReadLen == 0)
  58. {
  59. retVal = false;
  60. break;
  61. }
  62. if('n' == *(buf+nDataLen))
  63. {
  64. bLineEnd = true;
  65. }
  66. else
  67. {
  68. nDataLen += nReadLen;
  69. }
  70. }
  71. return retVal;
  72. }
  73. bool SendLine(SOCKET s, char* str)
  74. {
  75. int retVal;
  76. retVal = send(s, str, strlen(str), 0);
  77. if( retVal == INVALID_SOCKET)
  78. {
  79. return false;
  80. }
  81. return true;
  82. }
  83. int ExitClient(int nExit)
  84. {
  85. closesocket(sServer);
  86. closesocket(sClient);
  87. WSACleanup();
  88. return nExit;
  89. }
  90. int main(int argc, char* argv[])
  91. {
  92. InitMember();
  93. wVersionRequested = MAKEWORD(1,1);
  94. retVal = WSAStartup(wVersionRequested, &wsd);
  95. if(retVal != 0)
  96. {
  97. ShowSocketMsg("can not find a usable Windows Sockets dll!");
  98. return SERVER_DLL_ERROR;
  99. }
  100. if(LOBYTE(wsd.wVersion) != 1 || HIBYTE(wsd.wVersion) != 1)
  101. {
  102. ShowSocketMsg("can not find a usable windows sockets dll!");
  103. WSACleanup();
  104. return SERVER_DLL_ERROR;
  105. }
  106. sServer = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
  107. if(sServer == INVALID_SOCKET)
  108. {
  109. return HandleSocketError("Failed socket()");
  110. }
  111. SOCKADDR_IN addrServ;
  112. addrServ.sin_family   = AF_INET;
  113. addrServ.sin_addr.S_un.S_addr = INADDR_ANY;
  114. addrServ.sin_port   = htons(SERVERPORT);
  115. retVal = bind(sServer, (SOCKADDR *)&addrServ, sizeof(addrServ));
  116. if(retVal == SOCKET_ERROR)
  117. {
  118. closesocket(sServer);
  119. return HandleSocketError("Failed bind()");
  120. }
  121. retVal = listen(sServer, 3);
  122. if(retVal == SOCKET_ERROR)
  123. {
  124. closesocket(sServer);
  125. return HandleSocketError("Failed listen()");
  126. }
  127. cout << "Server succeeded!" <<endl;
  128. cout << "Waitting for new clients..." <<endl;
  129. sockaddr_in addrClient;
  130. int addrClientLen   = sizeof(addrClient);
  131. sClient   = accept(sServer, (SOCKADDR *)&addrClient, &addrClientLen);
  132. if(sClient == INVALID_SOCKET)
  133. {
  134. closesocket(sServer);
  135. return HandleSocketError("Failed accept()!");
  136. }
  137. else
  138. {
  139. bConning = true;
  140. }
  141. char *pClientIp = inet_ntoa(addrClient.sin_addr);
  142. u_short clientPort = ntohs(addrClient.sin_port);
  143. cout<<"accept a new client"<<endl;
  144. cout<<"IP:"<<pClientIp<<endl;
  145. cout<<"Port:"<<clientPort<<endl;
  146. //接收客户端数据
  147. if (!RecvLine(sClient, bufRecv))
  148. {
  149. return ExitClient(SERVER_API_ERROR);//退出
  150. }
  151. //显示客户端数据
  152. cout << bufRecv<<endl;
  153. strcpy(bufSend, "Heallo Client!n");
  154. if(!SendLine(sClient, bufSend))
  155. {
  156. return ExitClient(SERVER_API_ERROR);
  157. }
  158. //显示退出信息
  159. cout << "Server exiting..." << endl;
  160. //退出
  161. return ExitClient(0);
  162. }