网络编程(六)TCP并发服务器

网络编程(六)TCP并发服务器

码农世界 2024-06-21 后端 57892 次浏览 31038个评论

文章目录

    • (一)概念
    • (二)TCP并发服务器
    • (三)使用多线程实现TCP并发服务器
      • 1. 思路
      • 2. 注意点
      • 3. 代码实现
      • (四)使用多进程实现TCP并发服务器
        • 1. 思路
        • 2. 注意点
        • 3. 代码实现
        • 4. 关于子进程结束后的资源回收问题
        • (五)使用IO复用实现TCP并发服务器
          • 1. 思路
          • 2. 代码实现

            (一)概念

            循环服务器:同一时刻只能处理一个客户端的请求。

            并发服务器:可以同时处理多个客户端的请求 相互之间不影响。

            并发和并行的区别:

            并发:并发是指两个或多个事件在 同一时间间隔 发生,把任务在不同的时间点交给处理器进行处理。在同一时间点,任务并不会同时运行。

            并行(多核CPU):并行是指两个或者多个事件在 同一时刻同时 发生,把每一个任务分配给每一个处理器独立完成。在同一时间点,任务一定是同时运行。

            (二)TCP并发服务器

            方式1:使用多线程实现

            方式2:使用多进程实现

            方式3:使用多路IO复用

            (三)使用多线程实现TCP并发服务器

            1. 思路

            主线程负责等待客户端连接(accept);

            一旦有客户端连接成功,就创建一个子线程,专门用来和该客户端通信

            2. 注意点

            1. 使用多线程一定要注意线程间的同步和互斥问题

            3. 代码实现

            server.c

            #include 
            sem_t sem;
            typedef struct _Msg{
                int acceptfd;
                struct sockaddr_in clientaddr;
            }msg_t;
            void *task_func(void *msg){
                pthread_detach(pthread_self());//标记为分离态
                msg_t client_msg=*(msg_t *)msg;
                sem_post(&sem);
                char buff[128]={0};
                int nbytes=0;
                while(1){
                    printf("开始通信  acceptfd = %d\n", client_msg.acceptfd);
                    if(-1 == (nbytes = recv(client_msg.acceptfd,buff,sizeof(buff),0))){
                        //出错
                        close(client_msg.acceptfd);
                        pthread_exit(NULL);
                    }else if(0 == nbytes){//recv接收到的是0
                        //客户端断开
                        close(client_msg.acceptfd);
                        pthread_exit(NULL);
                    }
                    if(!strcmp(buff,"quit")){
                        close(client_msg.acceptfd);
                        pthread_exit(NULL);
                    }
                    //正常接收数据
                    printf("线程[%ld]接收到数据[%s]\n",pthread_self(),buff);
                    strcat(buff,"--zyx");
                    if(-1 == send(client_msg.acceptfd,buff,sizeof(buff),0)){
                        close(client_msg.acceptfd);
                        pthread_exit(NULL);
                    }
                }
            }
            int main(int argc, char const *argv[])
            {
                if(3 != argc){
                    printf("Usage:%s IPv4 port\n",argv[0]);
                    exit(-1);
                }
               
                //创建套接字
                int sockfd=0;
                if(-1 == (sockfd = socket(AF_INET,SOCK_STREAM,0))){
                    ERR_LOG("sock error");
                }
                //填充结构体
                struct sockaddr_in serveraddr;
                serveraddr.sin_family=AF_INET;
                serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
                serveraddr.sin_port=htons(atoi(argv[2]));
                socklen_t serveraddrlen = sizeof(serveraddr);
                //绑定结构体信息
                if (-1 == bind(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen)){
                    ERR_LOG("bind error");
                }
                //设置为监听状态
                if(-1 == listen(sockfd, 5))
                    ERR_LOG("listen error");
                //客户端结构体保存网络信息
                struct sockaddr_in clientaddr;
                socklen_t clientaddrlen = sizeof(clientaddr);
                
                msg_t msg;
                int acceptfd = 0;
                pthread_t tid=0; 
                //无名信号量
                sem_init(&sem,0,1);
                while(1){
                    printf("已就绪,等待连接..\n");
                    //主线程等待连接
                    if (-1 == (acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&clientaddrlen))){
                        ERR_LOG("accept error");
                    }
                    printf("有客户端连接\n");
                    //如果主线程连接到了客户端,就创建子线程用来与客户端通信
                    sem_wait(&sem);
                    msg.acceptfd = acceptfd;
                    msg.clientaddr = clientaddr;
                    if(0 != pthread_create(&tid,NULL,task_func, &msg)){
                        perror("pthread_create error");
                    }
                }
                close(sockfd);
                return 0;
            }
            

            client.c

            #include 
            int main(int argc, char const *argv[])
            {
                if(3 != argc){
                    printf("Usage:%s Ipv4 port\n",argv[0]);
                    exit(-1);
                }
                //创建套接字
                int sockfd=0;
                if(-1 ==(sockfd = socket(AF_INET,SOCK_STREAM,0))){
                    ERR_LOG("socket error");
                }
                //填充结构体
                struct sockaddr_in serveraddr;
                serveraddr.sin_family=AF_INET;
                serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
                serveraddr.sin_port=htons(atoi(argv[2]));
                socklen_t serverlen = sizeof(serveraddr);
                //连接服务器
                if(-1 == connect(sockfd,(struct sockaddr *)&serveraddr,serverlen)){
                    ERR_LOG("connect error");
                }
                printf("连接成功\n");
                char buff[128]={0};
                while(1){
                    scanf("%s",buff);
                    if(-1 == send(sockfd,buff,sizeof(buff),0)){
                        ERR_LOG("send error");
                    }
                    printf("数据[%s]已发送\n",buff);
                    if(!strcmp(buff,"quit")){
                        break;
                    }
                    memset(buff,0,sizeof(buff));
                    if(-1 == recv(sockfd,buff,sizeof(buff),0)){
                        ERR_LOG("recv error");
                    }
                    printf("接收到数据[%s]\n",buff);
                }
                close(sockfd);
                return 0;
            }
            

            (四)使用多进程实现TCP并发服务器

            1. 思路

            父进程负责accept等待客户端连接;

            一旦有客户端连接成功,就创建一个子进程,专门用来和该客户端通信

            2. 注意点

            多进程要注意子进程资源的回收问题,在服务器程序中如果不及时回收子进程资源,子进程会成为僵尸进程,浪费系统资源

            3. 代码实现

            #include 
            //信号处理函数
            void sig_fun(int signum){
                if(SIGCHLD == signum){
                    wait(NULL);
                }
            }
            int main(int argc, char const *argv[])
            {
                if(3 != argc){
                    printf("Usage:%s IPv4 port\n",argv[0]);
                    exit(-1);
                }
               
                //创建套接字
                int sockfd=0;
                if(-1 == (sockfd = socket(AF_INET,SOCK_STREAM,0))){
                    ERR_LOG("sock error");
                }
                //填充结构体
                struct sockaddr_in serveraddr;
                serveraddr.sin_family=AF_INET;
                serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
                serveraddr.sin_port=htons(atoi(argv[2]));
                socklen_t serveraddrlen = sizeof(serveraddr);
                //绑定结构体信息
                if (-1 == bind(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen)){
                    ERR_LOG("bind error");
                }
                //设置为监听状态
                if(-1 == listen(sockfd, 5))
                    ERR_LOG("listen error");
                //客户端结构体保存网络信息
                struct sockaddr_in clientaddr;
                socklen_t clientaddrlen = sizeof(clientaddr);
                
                int acceptfd = 0;
                pid_t pid=0; 
                //捕捉SIGCHLD信号
                signal(SIGCHLD,sig_fun);
                while(1){
                    printf("已就绪,等待连接..\n");
                    //主线程等待连接
                    if (-1 == (acceptfd = accept(sockfd,(struct sockaddr *)&clientaddr,&clientaddrlen))){
                        ERR_LOG("accept error");
                    }
                    printf("有客户端连接\n");
                    if(-1 == (pid=fork())){//出错
                        ERR_LOG("fork error");
                    }else if(0 == pid){//子进程
                        //执行完fork之后,父进程和子进程都各自有一个acceptfd和一个sockfd
                        close(sockfd);
                        char buff[128]={0};
                        int nbytes=0;
                        while(1){
                            printf("开始通信\n");
                            if(-1 == (nbytes = recv(acceptfd,buff,sizeof(buff),0))){//出错
                                break;
                            }else if(0 == nbytes){//recv接收到的是0,客户端断开
                                break;
                            }
                            if(!strcmp(buff,"quit")){
                                break;
                            }
                            //正常接收数据
                            printf("进程[%d]接收到数据[%s]\n",getpid(),buff);
                            strcat(buff,"--zyx");
                            if(-1 == send(acceptfd,buff,sizeof(buff),0)){
                                break;
                            }
                        }
                        //子进程退出
                        close(acceptfd);
                        exit(0);
                    }else if(0 < pid){//父进程
                        close(acceptfd);//关闭父进程acceptfd,回收文件描述符资源
                    }
                }
                close(sockfd);
                return 0;
            }
            

            4. 关于子进程结束后的资源回收问题

            方式1:父进程退出时,子进程都变成孤儿,被init回收资源 但是我们父进程的是服务器进程 不会退出

            方式2:使用wait阻塞的方式回收 --不推荐用 因为又多了一个阻塞的函数

            方式3:使用waitpid非阻塞方式回收 --不推荐用 因为需要轮询 占用CPU

            方式4:比较好的处理方式是 子进程退出时给父进程发信号 父进程接到信号后再去回收子进程资源(可以通过捕捉SIGCHLD SIGUSR1 SIGUSR2)

            (五)使用IO复用实现TCP并发服务器

            1. 思路

            TCP的服务器默认不支持并发,原因是两类阻塞的函数 accept 和 recv之间相互影响

            也就是说,本质上就是因为 sockfd 和 acceptfd 两类文件描述符的缓冲区中没有内容

            就会阻塞,而且多个阻塞之间相互影响。

            使用IO复用来监视文件描述符,当sockfd就绪,就说明有新的客户端连接;acceptfd就绪,就说明有已连接的客户端发送数据。

            2. 代码实现

            #include 
            int main(int argc, char const *argv[])
            {
                if(3 != argc){
                    printf("Usage:%s IPv4 port\n",argv[0]);
                    exit(-1);
                }
                //创建套接字
                int sockfd=0;
                if(-1 == (sockfd = socket(AF_INET,SOCK_STREAM,0))){
                    ERR_LOG("sock error");
                }
                //填充结构体
                struct sockaddr_in serveraddr;
                serveraddr.sin_family=AF_INET;
                serveraddr.sin_addr.s_addr=inet_addr(argv[1]);
                serveraddr.sin_port=htons(atoi(argv[2]));
                socklen_t serveraddrlen = sizeof(serveraddr);
                //绑定结构体信息
                if (-1 == bind(sockfd,(struct sockaddr *)&serveraddr,serveraddrlen)){
                    ERR_LOG("bind error");
                }
                //设置为监听状态
                if(-1 == listen(sockfd, 5))
                    ERR_LOG("listen error");
                
                int acceptfd = 0;
                pid_t pid=0; 
                
                //创建集合
                fd_set readfds;     //母本
                FD_ZERO(&readfds);  //清空母本
                fd_set tempfds;     //备份
                FD_ZERO(&tempfds);  //清空备份
                int max_fd=0;       //缓存最大的文件描述符
                
                //首先将sockfd添加到监听队列中
                FD_SET(sockfd,&readfds);
                max_fd = max_fd > sockfd ? max_fd : sockfd; //更新最大的文件描述符
                
                int ret=0;          //缓存就绪文件描述符的个数
                int i=0;            //遍历变量
                int nbytes=0;       //缓存接收到的数据字节数
                char buff[128]={0}; //缓存数据
                while(1){
                    //将母本复制给temp,对所有文件描述符进行监听
                    tempfds = readfds;
                    //开始监听,没有文件描述符准备就绪时就阻塞
                    if(-1 == (ret = select(max_fd+1,&tempfds,NULL,NULL,NULL))){
                        ERR_LOG("select error");
                    }
                    //有fd准备就绪,遍历处理
                    for(i = 3; i < max_fd+1 && ret != 0; i++){
                        //判断i是否就绪
                        if(FD_ISSET(i, &tempfds)){
                            ret--;
                            //判断就绪的i是否是sockfd,如果是说明有客户端连接
                            if(sockfd == i){
                                if(-1 == (acceptfd = accept(i,NULL,NULL))){
                                    ERR_LOG("accept error");
                                }
                                printf("客户端[%d]连接\n",acceptfd);
                                FD_SET(acceptfd, &readfds);//将新的acceptfd添加到集合中
                                max_fd = max_fd > acceptfd ? max_fd : acceptfd;//更新最大的文件描述符
                            }else{//说明有已经连接的客户端发来数据了
                                if(-1 == (nbytes = recv(i,buff,sizeof(buff),0))){
                                    ERR_LOG("recv error");
                                }else if(0 == nbytes){ //说明有客户端断开连接
                                    printf("客户端[%d]断开链接\n",i);
                                    FD_CLR(i, &readfds);//将其移除队列
                                    close(i);//关闭其文件描述符
                                    continue;//跳过本次for循环
                                }
                                if(!strcmp(buff,"quit")){ //说明有客户端退出
                                    printf("客户端[%d]退出\n",i);
                                    FD_CLR(i, &readfds);//将其移除队列
                                    close(i);//关闭其文件描述符
                                    continue;//跳过本次for循环
                                }
                                //正常接收数据
                                printf("接收到数据:[%s]\n",buff);
                                strcat(buff,"--zyx");
                                if(-1 == send(i,buff,sizeof(buff),0)){
                                    ERR_LOG("send error");
                                }
                            }
                        }
                    }
                }
                close(sockfd);
            }
            

转载请注明来自码农世界,本文标题:《网络编程(六)TCP并发服务器》

百度分享代码,如果开启HTTPS请参考李洋个人博客
每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (有 31038 条评论,57892人围观)参与讨论
网友昵称:游客
游客游客 沙发
07-08 回复
经典!http://zssb9.bjaksj.com
网友昵称:游客
游客游客 椅子
07-08 回复
经典,收藏了!http://vlew3.bjaksj.com
网友昵称:游客
游客游客 地板
07-08 回复
我裤子脱了,纸都准备好了,你就给我看这个?http://oz62m7.bjaksj.com
网友昵称:游客
游客游客 4楼
07-08 回复
勤奋灌水,天天向上!http://rc04.bjaksj.com
网友昵称:游客
游客游客 5楼
07-09 回复
楼主最近很消极啊!http://7dd.dgflt.com
网友昵称:游客
游客游客 6楼
07-09 回复
楼主是我最崇拜的人!http://gbc.dgflt.com
网友昵称:游客
游客游客 7楼
07-09 回复
今天是个特别的日子,值得纪念!http://cit5p.szjcwsj.com/B/3.html
网友昵称:游客
游客游客 8楼
07-09 回复
楼主是男的还是女的?http://ba5h.dggis.com
网友昵称:游客
游客游客 9楼
07-09 回复
楼主练了葵花宝典吧?http://hg28hp.dggis.com
网友昵称:游客
游客游客 10楼
07-09 回复
楼主英明!http://1xxub.tywl8888.com/2/3.html
网友昵称:游客
游客游客 11楼
07-09 回复
以后要跟楼主好好学习学习!http://un6.dgflt.com
网友昵称:游客
游客游客 12楼
07-09 回复
这里的资源非常丰富,帮助我解决了很多问题。http://7j17b.dgflt.com
网友昵称:游客
游客游客 13楼
07-10 回复
看帖不回帖都是耍流氓!http://hmp84b.dggis.com
网友昵称:游客
游客游客 14楼
07-10 回复
楼主就是我的榜样哦http://y9ubi.wanweiweb.com
网友昵称:游客
游客游客 15楼
07-10 回复
读了楼主的帖子,顿时马桶就通了。。。http://vwafh6.dggis.com
网友昵称:游客
游客游客 16楼
07-10 回复
被楼主的逻辑打败了!http://rd8ri.wanweiweb.com
网友昵称:游客
游客游客 17楼
07-10 回复
楼主的帖子越来越有深度了!http://tw1vw2.wanweiweb.com
网友昵称:游客
游客游客 18楼
07-10 回复
写得实在太好了,我唯一能做的就是默默顶贴!http://5b49j.gmreol.com/2024/3.html
网友昵称:游客
游客游客 19楼
07-10 回复
有钱、有房、有车,人人都想!http://d-icecream.com/html/80d099802.html
网友昵称:游客
游客游客 20楼
07-10 回复
论坛的人气越来越旺了!http://aln.qdjtbd.cn
网友昵称:游客
游客游客 21楼
07-10 回复
祖国尚未统一,我却天天灌水,好内疚!http://x3z08.jinpuxiye.com
网友昵称:游客
游客游客 22楼
07-11 回复
感谢楼主的推荐!http://89q2g.qdjtbd.cn
网友昵称:游客
游客游客 23楼
07-11 回复
楼主就是我的榜样哦http://x1svtx.taidachemical.com
网友昵称:游客
游客游客 24楼
07-11 回复
今天上网不回帖,回帖就回精华帖!http://98hg18.taidachemical.com
网友昵称:游客
游客游客 25楼
07-11 回复
对牛弹琴的人越来越多了!http://www.2qukuai.com
网友昵称:游客
游客游客 26楼
07-11 回复
读了楼主的帖子,顿时马桶就通了。。。http://www.gxmlm.com
网友昵称:游客
游客游客 27楼
07-11 回复
楼主看起来很有学问!http://zhc0.wysyw.com
网友昵称:游客
游客游客 28楼
07-11 回复
楼上的真不讲道理!http://jpb4.wysyw.com
网友昵称:游客
游客游客 29楼
07-11 回复
感谢楼主的推荐!http://ct6.aijiankang99.com
网友昵称:游客
游客游客 30楼
07-11 回复
大神好强大!http://ciajt3.dzjydq.com
网友昵称:游客
游客游客 31楼
07-11 回复
很给力!http://k2koph.xmqiandao.com
网友昵称:游客
游客游客 32楼
07-11 回复
没人理我,好伤心啊!http://k04.dzjydq.com
网友昵称:游客
游客游客 33楼
07-11 回复
好东西,学习学习!http://62p.sxtytx.com
网友昵称:游客
游客游客 34楼
07-11 回复
看在楼主的面子上,认真回帖!http://59op.zggbsf.com
网友昵称:游客
游客游客 35楼
07-11 回复
太高深了,理解力不够用了!http://m5u08.zggbsf.com
网友昵称:游客
游客游客 36楼
07-11 回复
楼主是好人!http://www.ddman.net
网友昵称:游客
游客游客 37楼
07-11 回复
楼主是在找骂么?http://n41gx.xmqiandao.com
网友昵称:游客
游客游客 38楼
07-11 回复
有品位!http://2cr.xmqiandao.com
网友昵称:游客
游客游客 39楼
07-11 回复
关注一下!http://x20a.dzdcmy.com
网友昵称:游客
游客游客 40楼
07-11 回复
楼主的头像能辟邪啊!http://3qbfq.c-e-cars.com
网友昵称:游客
游客游客 41楼
07-11 回复
哥回复的不是帖子,是寂寞!http://j770ug.zggbsf.com
网友昵称:游客
游客游客 42楼
07-11 回复
知识就是力量啊!http://y1nbn.zggbsf.com
网友昵称:游客
游客游客 43楼
07-11 回复
管它三七二十一!http://ccv162.newsourc.com
网友昵称:游客
游客游客 44楼
07-11 回复
楼主很有激情啊!http://tmgc.zggbsf.com
网友昵称:游客
游客游客 45楼
07-11 回复
今天怎么了,什么人都出来了!http://gp07d.zggbsf.com
网友昵称:游客
游客游客 46楼
07-11 回复
坚持回帖!http://96hbse.dzdcmy.com
网友昵称:游客
游客游客 47楼
07-11 回复
好帖子!http://hlf7c.kjpx51.com/13/5.html
网友昵称:游客
游客游客 48楼
07-11 回复
我裤子脱了,纸都准备好了,你就给我看这个?http://l1d.yh-cc.com
网友昵称:游客
游客游客 49楼
07-11 回复
看了这么多帖子,第一次看到这么经典的!http://www.gxmlm.com
网友昵称:游客
游客游客 50楼
07-11 回复
楼上的真不讲道理!http://nqv8.cyzjj.com
网友昵称:游客
游客游客 51楼
07-11 回复
我对楼主的敬仰犹如滔滔江水绵延不绝!http://jgdh.xiangbanjia.com
网友昵称:游客
游客游客 52楼
07-11 回复
今天是个特别的日子,值得纪念!http://iqibg.xiangbanjia.com
网友昵称:游客
游客游客 53楼
07-11 回复
刚看见一个妹子,很漂亮!http://www.ddman.net
网友昵称:游客
游客游客 54楼
07-11 回复
今天上网不回帖,回帖就回精华帖!http://rix8l.302tuan.com/13/5.html
网友昵称:游客
游客游客 55楼
07-11 回复
赞一个!http://dyf3ao.xiangbanjia.com
网友昵称:游客
游客游客 56楼
07-11 回复
太高深了,理解力不够用了!http://p1y.sctjbp.com
网友昵称:游客
游客游客 57楼
07-11 回复
楼主发几张靓照啊!http://cr7.fy166.com
网友昵称:游客
游客游客 58楼
07-11 回复
在哪里跌倒,就在那里多爬一会儿!http://l33q.qy189.com
网友昵称:游客
游客游客 59楼
07-11 回复
我就搞不明白了,看帖回帖能死人么,居然只有我这么认真的在回帖!http://35bz.c-e-cars.com
网友昵称:游客
游客游客 60楼
07-11 回复
感觉不错!http://933bpp.ht-chem.com.cn
网友昵称:游客
游客游客 61楼
07-11 回复
今天过得很不爽!http://k5z2.ht-chem.com.cn
网友昵称:游客
游客游客 62楼
07-11 回复
这么版块的帖子越来越有深度了!http://lh7c3x.foodnmg.cn
网友昵称:游客
游客游客 63楼
07-11 回复
好无聊啊!http://3uvxy.c-e-cars.com
网友昵称:游客
游客游客 64楼
07-11 回复
以后要跟楼主好好学习学习!http://naipu.y51888888.com/j/5.html
网友昵称:游客
游客游客 65楼
07-11 回复
宇宙第一贴诞生了!http://p41.slphar.com
网友昵称:游客
游客游客 66楼
07-11 回复
在哪里跌倒,就在那里多爬一会儿!http://cnq.foodnmg.cn
网友昵称:游客
游客游客 67楼
07-11 回复
被楼主的逻辑打败了!http://r9d.jhwudo.com
网友昵称:游客
游客游客 68楼
07-11 回复
感谢楼主的推荐!http://n05.tike-tec.cn
网友昵称:游客
游客游客 69楼
07-11 回复
楼主发几张靓照啊!http://7y9.whxiewang.com
网友昵称:游客
游客游客 70楼
07-11 回复
观点鲜明,立场坚定,作者态度明确。http://0wjc1a.whxiewang.com
网友昵称:游客
游客游客 71楼
07-11 回复
以后就跟楼主混了!http://m3aq31.shenmuwh.com
网友昵称:游客
游客游客 72楼
07-11 回复
这么好的帖子,应该加精华!http://ezg6mo.shenmuwh.com
网友昵称:游客
游客游客 73楼
07-11 回复
楼主主机很热情啊!http://jm2m.shenmuwh.com
网友昵称:游客
游客游客 74楼
07-11 回复
赞一个!http://5ly.yh-cc.com
网友昵称:游客
游客游客 75楼
07-11 回复
我裤子脱了,纸都准备好了,你就给我看这个?http://t9u3.253fe.com
网友昵称:游客
游客游客 76楼
07-11 回复
楼上的说的很多!http://8hjh.yh-cc.com
网友昵称:游客
游客游客 77楼
07-11 回复
以后就跟楼主混了!http://p4wsr.lygujiankang.com/07/5.html
网友昵称:游客
游客游客 78楼
07-11 回复
楼主写的很经典!http://ye9.yh-cc.com
网友昵称:游客
游客游客 79楼
07-11 回复
管它三七二十一!http://epox.yh-cc.com
网友昵称:游客
游客游客 80楼
07-11 回复
楼主就是我的榜样哦http://is3.xiangbanjia.com
网友昵称:游客
游客游客 81楼
07-11 回复
有机会找楼主好好聊聊!http://rg3m1s.cyzjj.com
网友昵称:游客
游客游客 82楼
07-11 回复
我裤子脱了,纸都准备好了,你就给我看这个?http://7n1.cyzjj.com
网友昵称:游客
游客游客 83楼
07-11 回复
支持一个http://22no.aijiankang99.com
网友昵称:游客
游客游客 84楼
07-12 回复
我和我的小伙伴都惊呆了!http://xn9p.aijiankang99.com
网友昵称:游客
游客游客 85楼
07-12 回复
有机会找楼主好好聊聊!http://b14wf.xiangbanjia.com
网友昵称:游客
游客游客 86楼
07-12 回复
论坛的人气越来越旺了!http://qb7j5.fy166.com
网友昵称:游客
游客游客 87楼
07-12 回复
楼主是一个典型的文艺青年啊!http://culgj.aijiankang99.com
网友昵称:游客
游客游客 88楼
07-12 回复
雷锋做好事不留名,都写在帖子里!http://5q7.fy166.com
网友昵称:游客
游客游客 89楼
07-12 回复
青春不在了,青春痘还在!http://b3sbg.syyczp88.com/27/5.html
网友昵称:游客
游客游客 90楼
07-12 回复
青春不在了,青春痘还在!http://50yxv.sctjbp.com
网友昵称:游客
游客游客 91楼
07-12 回复
楼主好聪明啊!http://b0equ.sctjbp.com
网友昵称:游客
游客游客 92楼
07-12 回复
楼上的这是啥态度呢?http://791t.ht-chem.com.cn
网友昵称:游客
游客游客 93楼
07-12 回复
楼主很有激情啊!http://nmh7f.sctjbp.com
网友昵称:游客
游客游客 94楼
07-12 回复
我只看看不说话。。。http://q34pap.sxtytx.com
网友昵称:游客
游客游客 95楼
07-12 回复
哥回复的不是帖子,是寂寞!http://i5n.sxtytx.com
网友昵称:游客
游客游客 96楼
07-12 回复
精华帖的节奏啊!http://9f8zd.lostockhallband.com
网友昵称:游客
游客游客 97楼
07-12 回复
楼主主机很热情啊!http://mu78w.slphar.com
网友昵称:游客
游客游客 98楼
07-12 回复
这个帖子好无聊啊!http://12uz.aijiankang99.com
网友昵称:游客
游客游客 99楼
07-12 回复
太高深了,理解力不够用了!http://3e1ex.xmqiandao.com
网友昵称:游客
游客游客 100楼
07-12 回复
学习雷锋,好好回帖!http://rnyx7.slphar.com
Top