• <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 天下 閱讀(494) 評論(0)  編輯 收藏 引用 所屬分類: SocketLinux編程

            <2011年5月>
            24252627282930
            1234567
            891011121314
            15161718192021
            22232425262728
            2930311234

            導航

            統計

            常用鏈接

            留言簿(4)

            隨筆分類(378)

            隨筆檔案(329)

            鏈接

            最新隨筆

            搜索

            最新評論

            亚洲欧美日韩精品久久| 人妻精品久久久久中文字幕一冢本| 精品国产福利久久久| 久久精品成人免费国产片小草| 久久久久综合国产欧美一区二区| 久久久久久免费视频| 国产高潮国产高潮久久久| 久久e热在这里只有国产中文精品99| 一本色道久久88综合日韩精品| 久久婷婷五月综合97色一本一本| 国产成人精品久久亚洲高清不卡 | 久久久久久久精品妇女99| 91精品国产91久久久久久青草| 久久精品国产清自在天天线| 国产精品成人99久久久久| 久久99久久99精品免视看动漫| 久久久精品日本一区二区三区| 无码国内精品久久人妻| 久久久免费观成人影院| 久久夜色精品国产亚洲| 人妻久久久一区二区三区| 久久免费国产精品| 精品久久久久久国产牛牛app| 69SEX久久精品国产麻豆| 亚洲精品乱码久久久久久蜜桃不卡 | 久久无码专区国产精品发布| 国产99精品久久| 亚洲一区精品伊人久久伊人| 精品久久久久久国产三级| 色成年激情久久综合| 国产亚洲婷婷香蕉久久精品| 日产精品久久久一区二区| 色妞色综合久久夜夜| 亚洲午夜久久久影院伊人| 久久99九九国产免费看小说| 亚洲精品99久久久久中文字幕| 久久精品亚洲精品国产欧美| 久久99精品免费一区二区| 欧美久久一级内射wwwwww.| 欧美色综合久久久久久| 超级97碰碰碰碰久久久久最新|