windows下比较好的select模型.

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


#include <iostream>
#include <WinSock2.h>


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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值