main.cpp
上传用户:dzyhzl
上传日期:2019-04-29
资源大小:56270k
文件大小:3k
源码类别:

模拟服务器

开发平台:

C/C++

  1. //目前使用的网络协议,头上两个字节是数据包的大小
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. #include "../IClient.h"
  6. #include "malloc.h"
  7. //////////////////////////////////////////////////////////////////////////
  8. // flying modified something
  9. //////////////////////////////////////////////////////////////////////////
  10. #define MAX_CLIENTS 60
  11. int g_nMaxClients = MAX_CLIENTS;
  12. void CALLBACK ServerEventNotify(void *lpParam, const unsigned long &ulnEventType)
  13. {
  14. IClient* pThis = (IClient*)lpParam;
  15. switch( ulnEventType )
  16. {
  17. case enumServerConnectCreate:
  18. break;
  19. case enumServerConnectClose:
  20. pThis->Shutdown();
  21. break;
  22. }
  23. }
  24. int main(int argc, char **argv) {
  25. //测试数据接收,使用多个线程,其中几个线程对某一个索引的连接增加数据,发送逐步增加的数据包,有三种情况,正好的,多个包的,不到一个包的数据
  26. //然后使用一个线程进行数据接收
  27. short nPortC = 1020;
  28. printf("Input port:");
  29. scanf("%d", &nPortC);
  30. printf("Input max clients: ");
  31. scanf("%d", &g_nMaxClients);
  32. if (g_nMaxClients <= 0)
  33. g_nMaxClients = 1;
  34. if (g_nMaxClients >= 500)
  35. g_nMaxClients = 500;
  36. int nClientCount = 0;
  37. ZBuffer buffer(1024*1024*4*g_nMaxClients, g_nMaxClients * 2);
  38. IClient** client = (IClient**)_alloca(sizeof(IClient*) * g_nMaxClients);
  39. //ZClient client(&buffer);
  40. char data_buf[256];
  41. unsigned int length;
  42. unsigned int nTotalRev = 0, nTotalSent = 0;
  43. for (int i = 0; i < sizeof(data_buf); i++)
  44. ((unsigned char*)data_buf)[i] = (unsigned char)i;
  45. nClientCount = g_nMaxClients;
  46. for (i = 0; i < g_nMaxClients; i++)
  47. {
  48. client[i] = new IClient(&buffer);
  49. //client[i]->RegisterMsgFilter(client[i], ServerEventNotify);
  50. client[i]->Startup();
  51. //if(!client[i]->ConnectTo("192.168.27.44", 5555)) {
  52. if(!client[i]->ConnectTo("192.168.27.44", nPortC)) {
  53. printf("%d connection failed!n");
  54. nClientCount = i;
  55. exit(-2);
  56. }
  57. }
  58. int Tick = 0;
  59. int nGoodConnection = 0;
  60. while (true)
  61. {
  62. Tick++;
  63. nGoodConnection = 0;
  64. for (int i = 0; i < nClientCount; i++) 
  65. {
  66. char *data = (char *)client[i]->GetPackFromServer(length);
  67. if (data)
  68. {
  69. //printf("client %d get data from server %d: [%02x] [%02x] [%02x] [%02x]n", i + 1, length, data[0], data[1], data[2], data[3]);
  70. }
  71. while(data) 
  72. {
  73. nTotalRev += length;
  74. data = (char *)client[i]->GetPackFromServer(length);
  75. }
  76. if (client[i]->bStop)
  77. {
  78. client[i]->Startup();
  79. if(!client[i]->ConnectTo("192.168.27.44", nPortC)) { //27.44", 1010)) {
  80. printf("%d reconnection failed!n");
  81. continue;
  82. }
  83. }
  84. nGoodConnection++;
  85. //每半秒发一次
  86. if (i % Tick % (1000 / 50 / 2) == Tick % (1000 / 50 / 2))
  87. {
  88. client[i]->SendPackToServer(data_buf, sizeof(data_buf));
  89. nTotalSent += sizeof(data_buf);
  90. //printf("** client %03d send %d bytes: [%02x] [%02x], rev = %d K, sent = %d Kn", i + 1, sizeof(data_buf), data_buf[0], data_buf[1], nTotalRev / 1024, nTotalSent / 1024);
  91. }
  92. //printf()
  93. }
  94. if (Tick % 10 == 0)
  95. printf("** client status: rev = %d K, sent = %d K, connections = %03d/%03dn",
  96. nTotalRev / 1024, nTotalSent / 1024, nGoodConnection, nClientCount);
  97. //0.05秒处理一次接收数据
  98. Sleep(50);
  99. }
  100. for (i = 0; i < g_nMaxClients; i++)
  101. {
  102. delete client[i];
  103. }
  104. return 0;
  105. }