windows下比较好的select模型.

原文转载自:https://www.cnblogs.com/qiyueliuguang/archive/2013/12/31/3498705.html


#include
#include


using namespace std;


#pragma comment(lib, "ws2_32")


int main(int argc, char **argv)
{
    WSADATA wsaData;
    WSAStartup(WINSOCK_VERSION, &wsaData);


    USHORT uPort = 4567;
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (INVALID_SOCKET == sListen)
    {
        cout << "socket error : " << GetLastError() << endl;
        return 0;
    }


    SOCKADDR_IN sin;
    sin.sin_family = AF_INET;
    sin.sin_port = htons(uPort);
    sin.sin_addr.S_un.S_addr = INADDR_ANY;


    if (SOCKET_ERROR == bind(sListen, (PSOCKADDR)&sin, sizeof(sin)))
    {
        cout << "Bind error : " << WSAGetLastError() << endl;
        closesocket(sListen);
        WSACleanup();
        return 0;
    }


    if (SOCKET_ERROR == listen(sListen, 5))
    {
        cout << "listen error : " << WSAGetLastError() << endl;
        closesocket(sListen);
        WSACleanup();
        return 0;
    }


    fd_set fdSocket;
    FD_ZERO(&fdSocket);
    FD_SET(sListen, &fdSocket);


    while (TRUE)
    {
        fd_set fdRead = fdSocket;
        int iRet = select(0, &fdRead, NULL, NULL, NULL);
        if (iRet > 0)
        {
            for (size_t i = 0; i < fdSocket.fd_count; i++)
            {
                if (FD_ISSET(fdSocket.fd_array[i], &fdRead))
                {
                    if (fdSocket.fd_array[i] == sListen)
                    {
                        if (fdSocket.fd_count < FD_SETSIZE)
                        {
                            SOCKADDR_IN addrRemote;
                            int iAddrLen = sizeof(addrRemote);
                            SOCKET sNew = accept(sListen, (PSOCKADDR)&addrRemote, &iAddrLen);
                            FD_SET(sNew, &fdSocket);
                            cout << "接收到连接(" << inet_ntoa(addrRemote.sin_addr) << ")" << endl;
                        }
                        else
                        {
                            cout << "连接太多!" << endl;
                            continue;
                        }
                    }
                    else
                    {
                        char szText[256];
                        int iRecv = recv(fdSocket.fd_array[i], szText, strlen(szText), 0);
                        if (iRecv > 0)
                        {
                            szText[iRecv] = '\0';
                            cout << "接收到数据:" << szText << endl;
                        }
                        else
                        {
                            closesocket(fdSocket.fd_array[i]);
                            FD_CLR(fdSocket.fd_array[i], &fdSocket);
                        }
                    }
                }
            }
        }
        else
        {
            cout << "select error : " << WSAGetLastError() << endl;
            closesocket(sListen);
            WSACleanup();
            break;
        }
    }


    shutdown(sListen, SD_RECEIVE);
    WSACleanup();


    return 0;
}

你可能感兴趣的:(Linux下开发)