一些源码

Code

//
这些事情属于那低回报的80%的时间里面的事情。那么我们应该尽可能的减少花费在这些事情上的时间,这才是我们应该从80/20定律中得出的结论。

  1. #include <tchar.h>  
  2. #include <iostream>  
  3. #include <algorithm>  
  4. #include <winsock2.h>  
  5. #include <crtdbg.h>  
  6. #include <cstring>  
  7. #include <iomanip>  
  8. #include <list>  
  9. #pragma comment(lib, "ws2_32.lib")  
  10. using namespace std;  
  11. #define LOC_PORT 5678  
  12. #define LOC_ADDR "127.0.0.1"  
  13. class CSocketObject  
  14. {  
  15. public:  
  16.     CSocketObject(){WSAStartup(MAKEWORD(2,2), &m_wsaData);}  
  17.     virtual ~CSocketObject(){WSACleanup();}  
  18. public:  
  19.     virtual void Run() = 0;  
  20. protected:  
  21.     WSADATA m_wsaData;  
  22. };  
  23. class CTcpServer : public CSocketObject  
  24. {  
  25. public:  
  26.     virtual void Run();  
  27. private:  
  28.     typedef struct  
  29.     {  
  30.         WSAEVENT event;  
  31.         SOCKET sock;  
  32.     }EVENT_T;  
  33.     list<EVENT_T> m_listClient;  
  34.     static WSAEVENT& DoGetEvent(EVENT_T& ev){return ev.event;}  
  35. };  
  36. void CTcpServer::Run()  
  37. {  
  38.     SOCKET tSock = socket(AF_INET, SOCK_STREAM, 0);  
  39.     char cBuf[1024];  
  40.     SOCKADDR_IN tAddr, tComeinAddr;  
  41.     tAddr.sin_family = AF_INET;  
  42.     tAddr.sin_port = htons(LOC_PORT);  
  43.     tAddr.sin_addr.s_addr = inet_addr(LOC_ADDR);  
  44.     _ASSERT(bind(tSock,(SOCKADDR*)&tAddr, sizeof(tAddr)) == 0);  
  45.     WSAEVENT hWSAEvent = WSACreateEvent();  
  46.     WSAEventSelect(tSock, hWSAEvent, FD_ACCEPT);  
  47.     _ASSERT(listen(tSock, 5) == 0);  
  48.     EVENT_T ev = {hWSAEvent, tSock};  
  49.     m_listClient.push_back(ev);  
  50.     WSAEVENT events[64];  
  51.     for (;;)  
  52.     {  
  53.         transform(m_listClient.begin(), m_listClient.end(), events, DoGetEvent);  
  54.         int dwIndex = WSAWaitForMultipleEvents(m_listClient.size(), events, false, WSA_INFINITE, false);  
  55.         list<EVENT_T>::iterator iter = m_listClient.begin();  
  56.         int iPos = 0;  
  57.         while (iPos++ != dwIndex - WSA_WAIT_EVENT_0)++iter;  
  58.         WSANETWORKEVENTS tNetEvents;  
  59.         WSAEnumNetworkEvents(iter->sock, iter->event, &tNetEvents);  
  60.         if (FD_ACCEPT & tNetEvents.lNetworkEvents)  
  61.         {  
  62.             if (0 != tNetEvents.iErrorCode[FD_ACCEPT_BIT])  
  63.             {  
  64.                 std::cout<<"accept error occured\n";  
  65.                 continue;  
  66.             }  
  67.             else  
  68.             {     
  69.                 int dwAddrLen = sizeof(tComeinAddr);  
  70.                 SOCKET tSockIn = accept(tSock, (sockaddr*)&tComeinAddr, &dwAddrLen);  
  71.                 ev.event = WSACreateEvent();  
  72.                 WSAEventSelect(tSockIn, ev.event, FD_READ | FD_CLOSE);  
  73.                 ev.sock = tSockIn;  
  74.                 m_listClient.push_back(ev);  
  75.                 cout << "new come in..." << inet_ntoa(tComeinAddr.sin_addr) << "\n";  
  76.                 send(tSockIn, "You are welcome", strlen("You are welcome"), 0);  
  77.             }  
  78.         }  
  79.         else if (FD_READ & tNetEvents.lNetworkEvents)  
  80.         {  
  81.             if (0 != tNetEvents.iErrorCode[FD_READ_BIT])  
  82.             {  
  83.                 std::cout<<"read error occured\n";  
  84.                 continue;  
  85.             }  
  86.             else  
  87.             {  
  88.                 int dwRet = recv(iter->sock, cBuf, 1024, 0);  
  89.                 if (SOCKET_ERROR == dwRet)  
  90.                 {  
  91.                 }  
  92.                 else  
  93.                 {  
  94.                     cout << "client...data: ";  
  95.                     for (int n = 0; n != dwRet; ++n)  
  96.                     {  
  97.                          cout << "0x" << hex << (int)cBuf[n] << " ";  
  98.                     }  
  99.                     cout << endl;  
  100.                 }  
  101.             }  
  102.         }  
  103.         else if (FD_CLOSE & tNetEvents.lNetworkEvents)  
  104.         {  
  105.             int dwNameLen = sizeof(tComeinAddr);  
  106.             getpeername(iter->sock, (sockaddr*)&tComeinAddr, &dwNameLen);  
  107.             closesocket(iter->sock);  
  108.             WSACloseEvent(iter->event);  
  109.             m_listClient.erase(iter);  
  110.             cout << "client..." << inet_ntoa(tComeinAddr.sin_addr) << " quit\n";  
  111.         }  
  112.     }  
  113. }  
  114. int _tmain(int argc, TCHAR *argv[])  
  115. {  
  116.     CSocketObject *poSockServer = new CTcpServer;  
  117.     poSockServer->Run();  
  118.     delete poSockServer;  
  119.     return 0;  
  120. }  



原文地址:https://www.cnblogs.com/xianqingzh/p/1566995.html