zoukankan      html  css  js  c++  java
  • 一些源码

    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. }  



  • 相关阅读:
    forever守护nodejs
    sql server自动备份
    mongodb数据库自动备份 windows
    mongodb中的objectId和字符串id之间的转换
    mongodb中内嵌数组的增删改查
    nodejs momentjs操作时间(24小时制)
    nodejs 获取某一时间的前一天 后一天
    FastDFS 文件上传成功,访问404
    Ubuntu16.04系统下FastDFS+Nginx安装配置
    ubuntu16.04安装python3.7
  • 原文地址:https://www.cnblogs.com/xianqingzh/p/1566995.html
Copyright © 2011-2022 走看看