• 之一 select模型


    // select.cpp : 定义控制台应用程序的入口点。
    //
    
    #include "stdafx.h"
    #include <WinSock2.h>
    #include <Windows.h>
    #include <iostream>
    #pragma comment(lib,"ws2_32.lib")
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        WORD wVersion = MAKEWORD(2,2);
        WSADATA wsaData = {0};
        if(WSAStartup(wVersion,&wsaData)!=0)
        {
            printf("Inin WSAStartup Error
    ");
            return -1;
        }
        
        SOCKET ListenSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
        if(ListenSocket==INVALID_SOCKET)
        {
            WSACleanup();
            printf("Create Socket Error
    ");
            return -1;
        }
        sockaddr_in LocalAddress;
        LocalAddress.sin_family = AF_INET;
        LocalAddress.sin_port = htons(9627);
        LocalAddress.sin_addr.S_un.S_addr = INADDR_ANY;
    
        if(bind(ListenSocket,(sockaddr*)&LocalAddress,sizeof(LocalAddress))==SOCKET_ERROR)
        {
            closesocket(ListenSocket);
            WSACleanup();
            printf("Failed bind()
    ");
            return -1;
        }
        listen(ListenSocket,5);
        
        fd_set fdSocket;
        FD_ZERO(&fdSocket);
        FD_SET(ListenSocket,&fdSocket);
        while(true)
        {
            fd_set fdRead = fdSocket;
            int iPending = select(0,&fdRead,NULL,NULL,NULL);
            if(iPending>0)
            {
                for(int i=0;i<(int)fdSocket.fd_count;i++)
                {
                    if(FD_ISSET(fdSocket.fd_array[i],&fdRead))
                    {
                        if(fdSocket.fd_array[i]==ListenSocket) //什么时候不相等,即能跳到下一个else
                        {
                            if(fdSocket.fd_count<FD_SETSIZE)
                            {
                                sockaddr_in addrRemote;
                                int nAddrLen = sizeof(addrRemote);
                                SOCKET sNew = accept(ListenSocket,(sockaddr*)&addrRemote,&nAddrLen);
                                FD_SET(ListenSocket,&fdSocket);
                                printf("接收到链接:%s
    ",inet_ntoa(addrRemote.sin_addr));
                            }
                            else
                            {
                                printf("Too much connections!
    ");
                                continue;
                            }
                        }
                        else
                        {
                            char szBufferData[0x1000];
                            int iReturn = recv(fdSocket.fd_array[i],szBufferData,0x1000,0);
                            if(iReturn > 0)
                            {
                                szBufferData[iReturn] = '';
                                printf("接受信息:%s
    ", szBufferData);
                            }
                            else
                            {
                                closesocket(fdSocket.fd_array[i]);
                                FD_CLR(fdSocket.fd_array[i],&fdSocket);
                            }
                        }
                    }
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    for of 与 for in的区别
    Mac Item2 SSH免密登录Linux 服务器的两种方式
    组塞式,非阻塞式,同步异步
    Thrift_简介(基于C#)
    HTTP Error 500.22
    http协议
    IIS_部署出错
    JavaScript如何实现继承
    $(function(){})与 (function(){})() (function($){})() 的区别
    C#_反射机制
  • 原文地址:https://www.cnblogs.com/littlepear/p/5693929.html
Copyright © 2020-2023  润新知