端口复用服务器模型

来源:互联网 发布:淘宝发短信的店铺链接 编辑:程序博客网 时间:2024/06/05 07:54

// I/O复用服务器模型

//select编程 

/***********************************

**** 版本:

**** 编写

**** 修改

***********************************/

 

程序流程

         

#include <sys/select.h>

/* According to earlier standards */

#include <sys/time.h>

#include <sys/types.h>

#include <unistd.h>

#include <sys/socket.h>

#include <stdio.h>

#include <errno.h>

#include <stdlib.h>

#include <linux/in.h>

#include <strings.h>

#define N 80

int main(void)

{

   int sokfid=0;

   int i;

   fd_set  readfds;     

   fd_set  readfdstemp;

   int  listenfd;

   int clienfd;

   int select_nu;

   char buf[100];

 

   struct sockaddr_in sever_in;

   struct sockaddr_in clien_in;

   int iaddrlen=sizeof(sever_in);

  

/******设置服务的socket sever_in *******/

   bzero(&sever_in,sizeof(sever_in));

   sever_in.sin_family=AF_INET;

   sever_in.sin_port=htons(9000);

   sever_in.sin_addr.s_addr=inet_addr("192.168.1.100");

/*****创建套接字***********************/

   if((sokfid=socket(AF_INET,SOCK_STREAM,0))==-1)

   {

       perror("creat sockt");

       exit(-1);

   }

/*****绑定套接字***********************/

 

   if(bind(sokfid,(struct sockaddr*)&sever_in,sizeof(sever_in))<0)

   {

       perror("bind:");

       exit(-1);

   }

 /*****建立监听队列***********************/

   listen(sokfid,5);

 /*****初始化读select集合****************/

   FD_ZERO(&readfds);

  /*****把套接字放入监控集合中*************/

   FD_SET(sokfid,&readfds);

  /**********扫描上限设置**************************** /

   select_nu=sokfid+1;

   while(1)

   {

 

       FD_SET(sokfid,&readfds);

      /*********设置临时监听集合**********************/

       readfdstemp=readfds;

      /*********启用select扫描集合中的就绪项**********/

     /**************************************************

     ***  select 为阻塞函数
      ***  select 把就绪项标志设为1,把非就绪项标志清零

***  利用临时的 集合readfdstemp很有必要
      ****************************************************/

       if(select(select_nu,&readfdstemp,NULL,NULL,NULL)>0)

       {

 

       }

       for(i=0;i<select_nu;i++)

       {

           if(FD_ISSET(i,&readfdstemp))

           {

                /********如果就绪队列socket链接活动那么就启动链接*************/

               if(i==sokfid)

               {

                   clienfd=accept(sokfid,(struct sockaddr*)&clien_in,&iaddrlen);

                   FD_SET(clienfd,&readfds);

                   select_nu=clienfd+1;

                   printf("%d\n",clienfd);

               }

               /***********如果服务器端的接受到客户端的信息就原样返回***********/

               else

               {

               

                        int n;

                       bzero(buf, sizeof(buf));

                       n = recv(i, buf, N, 0);

                       if (n == 0)

                       {

                           FD_CLR(i,&readfds);

                           select_nu--;

                           close(i);

                           break;

                       }

                       buf[n] = 0;

                       printf("n = %d: %s\n", n, buf);

                       send(i, buf, n, 0);

                        

                    printf("the end....\n");

 

               }

           } 

       }

   }

}

原创粉丝点击