• select Demo


      1 #include <iostream>
      2 #include <WinSock2.h>
      3 
      4 using namespace std;
      5 
      6 #pragma comment(lib, "ws2_32")
      7 
      8 int main(int argc, char **argv)
      9 {
     10     WSADATA wsaData;
     11     WSAStartup(WINSOCK_VERSION, &wsaData);
     12 
     13     USHORT uPort = 4567;
     14     SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
     15     if (INVALID_SOCKET == sListen)
     16     {
     17         cout << "socket error : " << GetLastError() << endl;
     18         return 0;
     19     }
     20 
     21     SOCKADDR_IN sin;
     22     sin.sin_family = AF_INET;
     23     sin.sin_port = htons(uPort);
     24     sin.sin_addr.S_un.S_addr = INADDR_ANY;
     25 
     26     if (SOCKET_ERROR == bind(sListen, (PSOCKADDR)&sin, sizeof(sin)))
     27     {
     28         cout << "Bind error : " << WSAGetLastError() << endl;
     29         closesocket(sListen);
     30         WSACleanup();
     31         return 0;
     32     }
     33 
     34     if (SOCKET_ERROR == listen(sListen, 5))
     35     {
     36         cout << "listen error : " << WSAGetLastError() << endl;
     37         closesocket(sListen);
     38         WSACleanup();
     39         return 0;
     40     }
     41 
     42     fd_set fdSocket;
     43     FD_ZERO(&fdSocket);
     44     FD_SET(sListen, &fdSocket);
     45 
     46     while (TRUE)
     47     {
     48         fd_set fdRead = fdSocket;
     49         int iRet = select(0, &fdRead, NULL, NULL, NULL);
     50         if (iRet > 0)
     51         {
     52             for (size_t i = 0; i < fdSocket.fd_count; i++)
     53             {
     54                 if (FD_ISSET(fdSocket.fd_array[i], &fdRead))
     55                 {
     56                     if (fdSocket.fd_array[i] == sListen)
     57                     {
     58                         if (fdSocket.fd_count < FD_SETSIZE)
     59                         {
     60                             SOCKADDR_IN addrRemote;
     61                             int iAddrLen = sizeof(addrRemote);
     62                             SOCKET sNew = accept(sListen, (PSOCKADDR)&addrRemote, &iAddrLen);
     63                             FD_SET(sNew, &fdSocket);
     64                             cout << "接收到连接(" << inet_ntoa(addrRemote.sin_addr) << "" << endl;
     65                         }
     66                         else
     67                         {
     68                             cout << "连接太多!" << endl;
     69                             continue;
     70                         }
     71                     }
     72                     else
     73                     {
     74                         char szText[256];
     75                         int iRecv = recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
     76                         if (iRecv > 0)
     77                         {
     78                             szText[iRecv] = '';
     79                             cout << "接收到数据:" << szText << endl;
     80                         }
     81                         else
     82                         {
     83                             closesocket(fdSocket.fd_array[i]);
     84                             FD_CLR(fdSocket.fd_array[i], &fdSocket);
     85                         }
     86                     }
     87                 }
     88             }
     89         }
     90         else
     91         {
     92             cout << "select error : " << WSAGetLastError() << endl;
     93             closesocket(sListen);
     94             WSACleanup();
     95             break;
     96         }
     97     }
     98 
     99     shutdown(sListen, SD_RECEIVE);
    100     WSACleanup();
    101 
    102     return 0;
    103 }
  • 相关阅读:
    C# 桥接模式(Bridge)
    C# 中介者模式(Mediator)
    C# 命令模式(Command)
    C# 模板方法(TempleteMethod)
    C# 装饰模式(Decorate)
    C# 策略模式(Strategy)
    C# 职责链模式(Chain of Responsibility)
    C# 外观模式(Facade)
    C# 单例模式(Single)
    C# 原型模式(Prototype)
  • 原文地址:https://www.cnblogs.com/qiyueliuguang/p/3498705.html
Copyright © 2020-2023  润新知