• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            天下

            記錄修行的印記

            linux Socket多路復用模式服務端 69.cpp

            // File: 69.cpp
            #include <iostream>
            #include 
            <map>
            #include 
            <stdio.h>
            #include 
            <unistd.h>
            #include 
            <stdlib.h>
            #include 
            <math.h>
            #include 
            <string.h> 
            #include 
            <strings.h>
            #include 
            <sys/types.h> 
            #include 
            <sys/socket.h> 
            #include 
            <netinet/in.h> 
            #include 
            <arpa/inet.h>
            #include 
            <bitset>
            using namespace std;
            #define PORT 1234   /* Port that will be opened */ 
            #define BACKLOG 5   /* Number of allowed connections */ 
            #define MAXDATASIZE 4096  

            typedef map
            <unsigned int,sockaddr_in> connects;
            void process_cli(int sockfd,sockaddr_in addr,char* recvbuf, int len);


            void reverser(char* szIn,char* szOut,unsigned int nLen) 
            {
             
            for (int i=0;i<nLen;i++) {
              szOut[i] 
            = szIn[nLen-i-1];
             }
            }

            int main() 

             connects connect_fds;
             
            int sock_fd;
             ssize_t recv_size;
             fd_set read_set;
             fd_set all_set;
             
            int listen_fd;
             
            int connect_fd;
             
            int ready_size;
             socklen_t addr_size; 
             sockaddr_in srv_addr;
             sockaddr_in addr;
             unsigned 
            int max_fd = 0;
             
            char recv_buf[MAXDATASIZE];

             
            if ((listen_fd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {
              perror(
            "Creating socket failed.");
              exit(
            1);
             }

             
            int opt = SO_REUSEADDR;
             setsockopt(listen_fd, SOL_SOCKET, SO_REUSEADDR, 
            &opt, sizeof(opt));

             bzero(
            &srv_addr,sizeof(srv_addr));
             srv_addr.sin_family
            =AF_INET; 
             srv_addr.sin_port
            =htons(PORT); 
             srv_addr.sin_addr.s_addr 
            = htonl (INADDR_ANY); 
             
            if (bind(listen_fd, (struct sockaddr *)&srv_addr, sizeof(struct sockaddr)) == -1) { 
              perror(
            "Bind error.");
              exit(
            1); 
             }    

             
            if(listen(listen_fd,BACKLOG) == -1) {  
              perror(
            "listen() error\n"); 
              exit(
            1); 
             } 
             max_fd 
            = listen_fd;
             addr_size
            =sizeof(sockaddr_in); 
             
             FD_ZERO(
            &all_set);
             FD_SET(listen_fd, 
            &all_set);

             connects::iterator iter;

             printf(
            "clients:(%u) ,current listen socket:%u\n",connect_fds.size(),listen_fd);
             
            while(1)
             {
              read_set 
            = all_set;
              ready_size 
            = select(max_fd+1&read_set, NULL, NULL, NULL);
              
            if ( FD_ISSET(listen_fd,&read_set) ) {
               connect_fd 
            = accept(listen_fd,(struct sockaddr *)&addr,&addr_size);
               
            if (connect_fd ==-1 ) {
                perror(
            "accept() error\n"); 
                
            continue
               }
               connect_fds[connect_fd]  
            = addr;
               max_fd 
            = connect_fd;
               FD_SET(connect_fd, 
            &all_set);
               printf(
            "clients:(%u) ,%s:%d connected ,connect socket:%u\n",connect_fds.size(),inet_ntoa(addr.sin_addr),ntohs(addr.sin_port),connect_fd);
              }

              
            for ( iter = connect_fds.begin(); iter!=connect_fds.end(); iter++) {
               sock_fd 
            = iter->first;
               addr 
            = iter->second;
               
            if ( FD_ISSET(sock_fd,&read_set) ) {
                recv_size 
            = recv(sock_fd, recv_buf, MAXDATASIZE,0);
                
            if ( recv_size == 0) {
                 close(sock_fd);
                 FD_CLR(sock_fd, 
            &all_set);
                 connect_fds.erase(sock_fd);
                 printf(
            "%s:%d disconnected\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port) );
                } 
                
            else {
                 process_cli(sock_fd,addr,recv_buf,recv_size);
                }
               }
              }
             }
             close(listen_fd);



            void process_cli(int sockfd,sockaddr_in addr,char* recvbuf, int len)
            {
             
            char sendbuf[MAXDATASIZE];
             printf(
            "Received %s:%d message: %s\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port), recvbuf);
             reverser(recvbuf,sendbuf,len);
             printf(
            "Send To  %s:%d message: %s\n",inet_ntoa(addr.sin_addr),ntohs(addr.sin_port), sendbuf);
             send(sockfd,sendbuf,len,
            0);
            }

            posted on 2011-09-08 16:03 天下 閱讀(499) 評論(0)  編輯 收藏 引用 所屬分類: SocketLinux編程

            <2011年9月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            2345678

            導航

            統(tǒng)計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            伊人色综合久久| 99热都是精品久久久久久| 国产免费福利体检区久久| 99久久无码一区人妻a黑| 一本色道久久综合狠狠躁| 国内精品伊人久久久久777| 久久亚洲AV成人无码电影| 99久久成人18免费网站| 一本色道久久88综合日韩精品| 亚洲AⅤ优女AV综合久久久| 久久综合五月丁香久久激情| 色偷偷偷久久伊人大杳蕉| 久久国产视频99电影| 亚洲精品乱码久久久久久| 亚洲国产成人久久综合一| 中文字幕无码av激情不卡久久| 久久久久久无码Av成人影院| 精品久久香蕉国产线看观看亚洲 | 久久偷看各类wc女厕嘘嘘| 国产精品久久久天天影视香蕉 | 精品国产乱码久久久久久浪潮| 三级韩国一区久久二区综合| 久久99精品综合国产首页| 亚洲欧美精品一区久久中文字幕| 久久精品人人做人人爽电影蜜月| 久久精品国产亚洲5555| 国产亚洲精品自在久久| 欧洲性大片xxxxx久久久| 色婷婷综合久久久久中文| 国产综合免费精品久久久| 99久久99这里只有免费的精品| 丰满少妇人妻久久久久久4| 国内精品伊人久久久久777| 久久人人爽人人爽人人片AV麻烦| 久久精品国产99国产精品澳门| 亚洲人成伊人成综合网久久久| 香蕉久久久久久狠狠色| 久久99国产精品久久| 久久人人添人人爽添人人片牛牛| 国产精品久久久天天影视香蕉| 国产精品一区二区久久不卡 |