select模型的服务器源码

// Nonblocking.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

#pragma comment(lib,"ws2_32.lib")

// listen port
u_short nListenPort = 5018;

// Initilize the listen socket
bool InitAndListen(SOCKET &sListen)
{
    WSADATA wsaData;
    int ret = WSAStartup(WINSOCK_VERSION,&wsaData);
    if(ret != 0)
    {
        printf("WASStarup failed/n");
        return false;
    }

    sockaddr_in local;
    local.sin_family      = AF_INET;
    local.sin_addr.s_addr = htonl(INADDR_ANY);
    local.sin_port        = htons(nListenPort);


    // Initial socket
    sListen = socket(AF_INET,SOCK_STREAM,0);
    if(sListen == INVALID_SOCKET)
    {
        printf("Initial socket failed/n");
        return false;
    }

 // set socket nonblocking
 u_long ul = 1;
 if (ioctlsocket(sListen,FIONBIO,&ul) != 0)
 {
  printf("set socket failed/n");
  return false;
 }

    // Bind socket
    if(bind(sListen,(sockaddr*)&local,sizeof(local)) != 0)
    {
        printf("Bind socket failed/n");
        return false;
    }

    // Listen socket
    if(listen(sListen,64) != 0)
    {
        printf("Listen socket failed/n");
        return false;
    }
 else
 {
  printf("Listen port %d/n",nListenPort);
 }

    return true;
}

int main(int argc, char* argv[])
{
 if (argc == 2)
 {
  nListenPort = atoi(argv[1]);
 }

    SOCKET sListen;
    if(!InitAndListen(sListen))
    {
        return 0;
    }

    printf("Server wait for client connect.../n");
   
 fd_set fdSocket;
    FD_ZERO(&fdSocket);
    FD_SET(sListen,&fdSocket);

    while (true)
    {
  // echo buffer
  char szBuf[16];

        // assign the fdSocket to fdRead to select
        fd_set fdRead = fdSocket;
        int nRet = select(NULL,&fdRead,NULL,NULL,NULL);
        if (nRet <= 0)
        {
            printf("select failed/n");
            break;
        }
    
        for(int i=0;i<(int)fdSocket.fd_count;i++)
        {
            // check whether the socket is set
            if(FD_ISSET(fdSocket.fd_array[i],&fdRead))
            {
                // New connect come
                if(fdSocket.fd_array[i] == sListen)
                {
                    sockaddr_in remote;
                    int nAddrLen = sizeof(remote);
                    SOCKET sNew = ::accept(sListen,(sockaddr*)&remote,&nAddrLen);
                
     FD_SET(sNew,&fdSocket);

     // Put it to fdSocket sets
                    printf("Client %s:%d connected/n",
      inet_ntoa(remote.sin_addr),ntohs(remote.sin_port));
                }
                else
                {
                    char szBuffer[4096];
                    memset(szBuffer,0,sizeof(szBuffer));

                    int nRecv = recv(fdSocket.fd_array[i],szBuffer,sizeof(szBuffer),0);
                    if (nRecv > 0)
                    {
                        printf("Received Client Msg:%s/n",szBuffer);
                ::send(fdSocket.fd_array[i],szBuf,sizeof(szBuf),0);
                    }
                    else
                    {
                        // Close the socket and clear from the sets
                        closesocket(fdSocket.fd_array[i]);
                      
      FD_CLR(fdSocket.fd_array[i],&fdSocket);
                    }
                }
            }
        }
    }

 closesocket(sListen);
 WSACleanup();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值