免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1683 | 回复: 6
打印 上一主题 下一主题

三机通讯问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-06-30 17:47 |只看该作者 |倒序浏览
问题是这样的,a与c机正常通讯,若出现异常则通知b机,b机做出判断,告诉a和c机重新启动。现在问题是不能实现应有的结果。请帮我分析,以下是代码:a.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <sys/wait.h>
#include <signal.h>


#define BUF_SIZE         1000
#define PROTOPORT1       6001            /* default protocol port number */
#define PROTOPORT2       6002


int check()
{
        struct sockaddr_in myaddr;
        struct sockaddr_in cad;
        int     s6,s7;              /* socket descriptor                   */
        
        fd_set  connect_sock_set;
        struct timeval         connect_sock_tv;
                     
        int i,alen,j;
        int     port;            /* protocol port number                */
        char buf[BUF_SIZE];
        
        s7=socket(PF_INET, SOCK_STREAM, 0);
        if (s7<0) {
                printf("socket s7 creation failed \n,%s\n",strerror(errno));
                exit(1);
        }
               
        printf("socket s7 is over \n");      
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
        myaddr.sin_family = PF_INET;         /* set family to Internet     */
        myaddr.sin_addr.s_addr = inet_addr("192.168.0.191");
        port = PROTOPORT1;       /* use default port number      */
        myaddr.sin_port = htons((u_short)port);
       
        if (bind(s7, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
                printf("bind s7 failed \n,%s\n",strerror(errno));
                close(s7);
                exit(1);
        }
        
        printf("bind s7 over! \n");
        
        if(listen(s7,BUF_SIZE)<0){
                printf("listen s7 failed \n,%s\n",strerror(errno));
                close(s7);
                exit(1);
        }   
        
        printf("listen from outer is over !\n");  
        
        FD_ZERO(&connect_sock_set);
           FD_SET(s7,  &connect_sock_set);

           connect_sock_tv.tv_sec = 120;
           connect_sock_tv.tv_usec = 0;
   
                          i=select(s7+1,&connect_sock_set, NULL, NULL, &connect_sock_tv);
                           if(i<0){
                                   printf("s7 timeoff! \n,%s\n",strerror(errno));
                                   close(s7);
                                   return (-1);
                           }
                           printf("select is made !\n");
                           //select(s7+1,&connect_sock_set, NULL, NULL, &connect_sock_tv);
                           if(FD_ISSET(s7,&connect_sock_set)){
                                   printf("inner and outer commucate rightly \n");
                                alen = sizeof(cad);
                                if ( (s6=accept(s7, (struct sockaddr *)&cad, &alen)) < 0) {
                                        printf(" accept s7 from outer failed\n,%s\n",strerror(errno));
                                        close(s6);
                                        close(s7);
                                        return -1;
                                }
               
                                printf("accept from outer is right!\n");
                  
                                   j=recv(s6, buf, 1000, 0);
                                   if( j<0){
                                           printf("recv from outer failed \n,%s\n",strerror(errno));
                                           close(s7);
                                           close(s6);
                                        return -1;
                                   }
                  
                                printf("recv from outer is right !\n");
               
                                strncpy(buf,"check right",10);
                                if( send(s6,buf,1000,0)<0){
                                        printf("send to outer and ask whether to reboot failed\n,%s \n",strerror(errno));
                                        close(s7);
                                        close(s6);
                                        return -1;
                                }
               
                                printf("send data to outer is right!\n");                 
                                   close(s6);
                                   printf("close s6 in check() if!\n");
                           }
                           else{
                                   printf("s7 timeoff! \n,%s\n",strerror(errno));
                                   close(s6);
                                   printf("close s6 in check() else!\n");
                                   return (-1);                                   
                           }
                
                 close(s7);
                 printf("close s7 in check()\n ");
                   return 0;
}

void report()
{       
        struct sockaddr_in theiraddr;
        struct sockaddr_in myaddr;
        
        int     s1,s4;              /* socket descriptor                   */
        
        char buf[BUF_SIZE];
        int     port;            /* protocol port number                */
        int alen;
        int numbytes;
        
        char * message_str="prepare to stop inner and outer";
        
        s4 = socket(PF_INET, SOCK_STREAM, 0);
        
        if (s4 < 0) {
                printf("socket s4 creation failed \n,%s\n",strerror(errno));
                exit(1);
        }
        
        printf("socket s4 creat succeed \n");       
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
        myaddr.sin_family = AF_INET;         /* set family to Internet     */
        myaddr.sin_addr.s_addr = inet_addr("192.168.250.101");       
        port = PROTOPORT2;       /* use default port number      */
        myaddr.sin_port = htons((u_short)port);       
                  
       if (connect(s4, (void  *)&myaddr, sizeof(myaddr)) < 0) {
               printf("connect to middle and to reboot failed \n,%s\n",strerror(errno));
               close(s4);
               exit(1);
        }
        printf("connect and report to halt information to middle and connect succeed \n");
        
        if(send(s4,message_str,strlen(message_str),0)<0){
                printf("send info to middle to reboot failed \n,%s\n",strerror(errno));
                close(s4);
                exit(1);
        }
        
        printf("send info and wait for middle detatition and make inner to halt \n");
        close(s4);
        printf("close socket s4 in report() \n");
        /*if(recv(s4,buf,sizeof(buf),0)<0){
                printf("recv failed \n");
                close(s4);
                exit(1);
        }*/        
      
}

int halt()
{
        struct sockaddr_in myaddr;
        struct sockaddr_in theiraddr;
        int     s1,s4;              /* socket descriptor                   */
        
        char * message_str="quit";
        
        int i,alen;
        int     port;            /* protocol port number                */
        char buf[BUF_SIZE];
        int numbytes;
        
        s4 = socket(PF_INET, SOCK_STREAM, 0);
        
        if (s4 < 0) {
                printf("socket s4 creation failed \n,%s\n",strerror(errno));
                exit(1);
        }
        printf("create socket s4 over \n");       
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
        myaddr.sin_family = PF_INET;         /* set family to Internet     */

        myaddr.sin_addr.s_addr = inet_addr("192.168.250.102");
        port = PROTOPORT2;       /* use default port number      */
        myaddr.sin_port = htons((u_short)port);
       
        if (bind(s4, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
                printf("bind s4 to middle and have get info to reboot failed\n,%s\n ",strerror(errno));
                close(s4);
                exit(1);
        }
        
        printf("bind sockedt s4 to inner right and prepare to reboot \n");
        
        if(listen(s4,BUF_SIZE)<0)        {
                printf("listen s4 to middle and get info to reboot failed \n,%s\n",strerror(errno));
                close(s4);
                exit(1);
        }      
        printf("listen the middle to send infomation and keep waiting \n");
        
        alen=sizeof(theiraddr);
     
        if(s1=accept(s4,(struct sockaddr*)&theiraddr,&alen)<0){
                printf("MIDDLE: accept s4 from middle and get info to reboot failed\n,%s\n",strerror(errno));
                close(s4);
                close(s1);
                exit(1);                        
        }
        printf("accept middle and prepare to reboot \n");
               
        if(recv(s1,buf,sizeof(buf),0)<0){
                printf("detation :recv s4 from middle failed \n,%s\n",strerror(errno));
                close(s1);
                close(s4);
                return -1;
        }
        printf("recv middle information and prepare to judge whether to reboot \n");
        
                      
        if(strcmp(buf,message_str)==0){
                       return (1);
        }
        printf("judge over ");
        close(s1);
        printf("close socket s1 in halt()\n");
        
        close(s4);
        printf("close socket s4 in halt()\n");
        return 0;
}               
                                                            

int main(int argc, char** argv)
{
        int     i,j;
      
        while(1){      
                i=check();
                if(i<0){
                        report();
                        while(1){                       
                                j=halt();
                                if(j=1){
                                        system("reboot");
                                }
                        }
                }
        }
}

论坛徽章:
0
2 [报告]
发表于 2006-06-30 17:47 |只看该作者

代码c

c机运行代码如下:c.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <sys/wait.h>
#include <signal.h>

#define BUF_SIZE  1000
#define PROTOPORT1       6001
#define PROTOPORT4      6004

int check()
{
       
        struct sockaddr_in myaddr;

        int s3;
        int i;
        int port,n,alen;
        char buf[BUF_SIZE];
        char * message_str="hello,inner";       
                   
        fd_set  connect_sock_set;
        struct timeval         connect_sock_tv;
       
        s3 = socket(PF_INET, SOCK_STREAM, 0);
        if(s3< 0) {
                printf(" socket s3 creation failed \n,%s\n",strerror(errno));
                exit (1);
        }
        printf("socket s3 in outer check()is over\n");
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
        myaddr.sin_family=PF_INET;
        myaddr.sin_addr.s_addr = inet_addr("192.168.0.191");       
        port=PROTOPORT1;
        myaddr.sin_port=htons((u_short)port);
       
        /*FD_ZERO(&connect_sock_set);
           FD_SET(s3,  &connect_sock_set);

           connect_sock_tv.tv_sec = 120;
           connect_sock_tv.tv_usec = 0;
   
           i=select(s3+1,&connect_sock_set, NULL, NULL, &connect_sock_tv);
          
           if(i<0){
                   printf("timeoff! \n");
                   close(s3);
                   return (-1);
           }
           printf("select close \n");        */
          
        if (connect(s3, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
                printf("connect s3 to inner failed \n,%s\n",strerror(errno));
                close(s3);
                return -1;
        }
       
        printf("connect to inner in check() is right!\n");       

        n = send(s3, message_str,strlen(message_str), 0);
        if (n <0 ){
                printf("send to inner failed \n,%s\n",strerror(errno));
                   close(s3);
                return -1;
        }
       
        printf("send info to inner in check() is right!\n");
       
        alen = recv(s3, buf, sizeof(buf), 0);
        if (alen < 0){
                printf(" recv info from inner failed \n,%s\n",strerror(errno));
                   close(s3);
                return -1;
        }
        printf("recv info from inner in check() is right!\n");
        close(s3);
        printf("close s3 in check()!\n");
        return 0;
       
}

void report()
{

        int s3;
       
        struct sockaddr_in myaddr;
        char * message_str="prepare to stop inner and outer";
               
        int numbytes;
        char buf[BUF_SIZE];
        int port;
        int alen;
       
        s3=socket(PF_INET,SOCK_STREAM ,0);
        if(s3<0){
                printf("socket s3 failed \n,%s\n",strerror(errno));
                exit (1);
        }
        printf("socket s3 in report()is successful \n");
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */       
        myaddr.sin_family=PF_INET;
        myaddr.sin_addr.s_addr = inet_addr("192.168.251.101");       
        port=PROTOPORT4;
        myaddr.sin_port=htons((u_short)port);       
       
        if (connect(s3, (void  *)&myaddr, sizeof(myaddr)) < 0) {
                printf("connect to middle and wait to reboot failed \n,%s\n",strerror(errno));
                close(s3);
                exit (1);
        }
        
        printf("connect in report() to middle and report result is right ! \n");
        
        if(send(s3,message_str,strlen(message_str),0)<0){
                printf("send to middle and wait to reboot failed \n,%s\n",strerror(errno));
                close(s3);
                exit (1);
        }
        
        printf("send to middle and give info and prepare to reboot in report()\n");
        close(s3);
        printf("close s3 in report() \n");
        /*if(recv(s3,buf,sizeof(buf),0)<0){
                printf("recv failed \n");
                close(s3);
                exit (1);
        }*/
        
}

       
int halt()
{       
        struct sockaddr_in myaddr;
        struct sockaddr_in server;
        int     s3,s2;              /* socket descriptor                   */

        char * message_str="quit";
        
        int i,alen;
        int     port;            /* protocol port number                */
        char buf[BUF_SIZE];
        int numbytes;
     
        s3 = socket(PF_INET, SOCK_STREAM, 0);
        
        if (s3 < 0) {
                printf("socket s3 creation failed \n,%s\n",strerror(errno));
                exit (1);
        }       
       
        printf("create socket s3 in halt ()succeed \n");
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
        myaddr.sin_family = PF_INET;         /* set family to Internet     */

        myaddr.sin_addr.s_addr = inet_addr("192.168.251.102");       
        port = PROTOPORT4;       /* use default port number      */
        myaddr.sin_port = htons((u_short)port);
       
        if (bind(s3, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
                printf("bind to middle failed\n,%s\n",strerror(errno));
                close(s3);
                exit (1);
        }
        printf("bind s3 in halt() to outer is over \n");
        if(listen(s3,BUF_SIZE)<0)        {
                printf("listen from middle and reboot failed \n,%s\n",strerror(errno));
                close(s3);
                exit (1);
        }      
        printf("listen  from middle in halt() is over \n");
        
        alen=sizeof(server);
      
                if(s2=accept(s3,(struct sockaddr*)&server,&alen)<0){
                        printf("MIDDLE accept from middle to reboot failed\n,%s\n",strerror(errno));
                        close(s3);
                        close(s2);
                        exit(1);                        
                }
                printf("accept in halt() info from middle and prepare to reboot \n");
               
                if(recv(s2,buf,sizeof(buf),0)<0){
                        printf("recv from middle to reboot  failed \n,%s\n",strerror(errno));
                        close(s2);
                        close(s3);
                        return -1;
                }
                printf("recv data in halt() from middle and prepare to reboot \n");        
                       if(strcmp(buf,message_str)==0){
                        return 1;
                }
                printf("judge info in halt() from middle and prepare reboot \n");
                close(s2);
                printf("close socket s2 in halt() \n");
                close(s3);
                printf("close socket s2 in halt() \n");
               
        return 0;       
}

int main(int argc ,char* argv[])
{
        int     i,j;

        while(1){
                i=check();
                if(i<0){
                        report();
                        while(1){
                                j=halt();
                                if(j=1){
                                        system("reboot");
                                }
                        }
                }
        }       
}

论坛徽章:
0
3 [报告]
发表于 2006-06-30 17:48 |只看该作者

b机代码如下:

b机代码如下:b.c
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <errno.h>
#include <sys/wait.h>
#include <signal.h>

#define BUF_SIZE 1000
#define PROTOPORT2 6002
#define PROTOPORT3 6003
#define PROTOPORT4 6004

char    *host_name1="192.168.254.1";
char    *host_name2="192.168.253.1";


int check_outer()
{
       
        struct sockaddr_in myaddr;
        struct sockaddr_in server;
        int s2,s3;
        int i;
        char buf[BUF_SIZE];
        char *message="quit";
        char * message_str="prepare to stop inner and outer";
               
        int alen;
        int port,n;
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
        myaddr.sin_family = PF_INET;         /* set family to Internet     */
        myaddr.sin_addr.s_addr = inet_addr("192.168.251.101");
        port = PROTOPORT4;       /* use default port number      */
        myaddr.sin_port = htons((u_short)port);

       
        if(( s2 = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
                printf(" socket s2 creation failed \n,%s \n",strerror(errno));
                exit(1);
        }
       
        printf("create socket s2 is right \n");
       
        if (bind(s2, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
                printf("bind s2 to middle failed \n,%s\n",strerror(errno));
                close(s2);
                exit(1);
        }
        
        printf("bind in checkouter() to s2 is right \n");
        
        if(listen(s2,BUF_SIZE)<0)        {
                printf("listen s2 failed \n,%s \n",strerror(errno));
                close(s2);
                exit(1);
        }  
        
        printf("listen outer in checkouter() is right \n");   
        
                                  
                   alen=sizeof(struct sockaddr);
                   if ( (s3=accept(s2, (struct sockaddr *)&server, &alen)) < 0) {
                           printf( " accept outer and find whether to reboot failed\n, %s\n",strerror(errno));
                           close(s3);
                           close(s2);
                        exit(1);
                    }
                   
                    printf("connect outer in checkouter() is right \n");
                   
                    i=recv(s3,buf,sizeof(buf),0);
                    if(i<0){
                        printf("recv s3 from outer failed\n, %s\n",strerror(errno));
                        close(s3);
                        close(s2);
                        return -1;
                }
               
                printf("recv data in checkouter() from outer is right!\n");
               
                if(strcmp(buf,message_str)==0){
                               return 1;
                }
                printf("halting infomation in checkout() to outer have been accepted \n");
                close(s3);
                printf("close s3 in checkouter() \n");
                close(s2);
                printf("close s2 in checkouter() \n");
        
        return 0;                  
}        

int check_inner()
{
       
        struct sockaddr_in myaddr;
        struct sockaddr_in server;
        int s4;
        int s1;
        int i;
        char buf[BUF_SIZE];
        char *message="quit";
        char * message_str="prepare to stop inner and outer";       
        int alen;
        int port,n;
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */
        myaddr.sin_family = PF_INET;         /* set family to Internet     */
        myaddr.sin_addr.s_addr = inet_addr("192.168.250.101");       
        port = PROTOPORT2;       /* use default port number      */
        myaddr.sin_port = htons((u_short)port);

       
        if(( s1 = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
                printf(" socket s1 in checkinner() creation failed \n,%s  \n",strerror(errno));
                exit(1);
        }
       
        printf("create socket s1 is right \n");
       
        if (bind(s1, (struct sockaddr *)&myaddr, sizeof(myaddr)) < 0) {
                printf("bind failed s1 to inner\n,%s\n",strerror(errno));
                close(s1);
                exit(1);
        }
        
        printf("bind s1 in checkinner() to middle is right \n");
        
        if(listen(s1,BUF_SIZE)<0) {
                printf("listen s1 failed \n,%s\n",strerror(errno));
                close(s1);
                exit(1);
        }      
        
        printf("listen in checkinner() to inner is right \n");
                                  
                   alen=sizeof(struct sockaddr);
                   if ( (s4=accept(s1, (struct sockaddr *)&server, &alen)) < 0) {
                                   printf( " accept inner info whether to reboot failed\n,%s \n",strerror(errno));
                                   close(s4);
                                   close(s1);
                                exit(1);
                    }
                   
                    printf("accept in checkinner() from inner is right \n");
                   
                    i=recv(s4,buf,sizeof(buf),0);
                    if(i<0){
                        printf("recv s4 failed \n,%s\n",strerror(errno));
                        close(s4);
                        return -1;
                }
               
                printf("recv in checkinner() from inner is right \n");
               
                if(strcmp(buf,message_str)==0){
                               return 1;
                }
                printf("halting in checkinner() infomation to inner have been accepted \n");
                close(s4);
                printf("close s4 in checkinner() \n");      
        close(s1);
        printf("close s3 in checkinner() \n");
        return 0;               
}

void notice_inner()
{
        int s1;
        struct sockaddr_in myaddr;
        char * message_str="quit";
             
        int numbytes;
        char buf[BUF_SIZE];
        int port;
        int alen;
       
        s1=socket(PF_INET,SOCK_STREAM ,0);
        if(s1<0){
                printf("socket s1 failed \n,%s\n",strerror(errno));
                exit (1);
        }
        printf("create socket s1 in notice_inner() is over \n");
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */       
        myaddr.sin_family=PF_INET;
        myaddr.sin_addr.s_addr = inet_addr("192.168.250.102");
        port=PROTOPORT2;
        myaddr.sin_port=htons((u_short)port);       
       
        if (connect(s1, (void  *)&myaddr, sizeof(myaddr)) < 0) {
                printf("connect s1 failed \n,%s\n",strerror(errno));
                close(s1);
                exit (1);
        }
        printf("connect in notice_inner() to inner and info inner to reboot");
        
        if(send(s1,message_str,strlen(message_str),0)<0){
                printf("send info to inner to reboot failed\n,%s \n",strerror(errno));
                close(s1);
                exit (1);
        }
        
       printf("send in notice_inner() info to inner and wait to reboot  \n");
        
        /*if(recv(s1,buf,sizeof(buf),0)<0){
                printf("recv failed \n");
                      close(s1);
                exit (1);
        }*/
        
        close(s1);
        printf("close s1 in notice_inner() \n");
}

void notice_outer()
{

        int s2;
       
        struct sockaddr_in myaddr;
       
        char * message_str="quit";
       
      
        int numbytes;
        char buf[BUF_SIZE];
        int port;
        int alen;
       
        s2=socket(PF_INET,SOCK_STREAM ,0);
        if(s2<0){
                printf("socket s2 failed \n,%s\n",strerror(errno));
                exit (1);
        }
        printf("socket s3 in notice_outer() succeed \n");
       
        memset((char *)&myaddr,0,sizeof(myaddr)); /* clear sockaddr structure */       
        myaddr.sin_family=PF_INET;
        myaddr.sin_addr.s_addr = inet_addr("192.168.251.102");
        port=PROTOPORT4;
        myaddr.sin_port=htons((u_short)port);       
       
        if (connect(s2, (void  *)&myaddr, sizeof(myaddr)) < 0) {
                printf("connect outer and to reboot failed\n,%s \n",strerror(errno));
                close(s2);
                exit (1);
        }
        printf("connect in notice_outer() to outer and prepare info outer to reboot");
        
        if(send(s2,message_str,strlen(message_str),0)<0){
                printf("send to outer to reboot failed\n,%s \n",strerror(errno));
                close(s2);
                exit (1);
        }
        printf("send in notice_outer() info to outer and reboot \n");
        
        /*if(recv(s2,buf,sizeof(buf),0)<0){
                printf("recv failed \n");
                close(s2);
                exit (1);
        }*/
        
        close(s2);
        printf("close s2 in notice_outer() \n");
}

                                     
       

int main(int argc,char *argv[])
{
        int i,j;
        while(1){
               
                i=check_inner();
                j=check_outer();
                if(i||j){
                        notice_inner();
                        notice_outer();
                }
        }       
}

论坛徽章:
0
4 [报告]
发表于 2006-06-30 18:09 |只看该作者
我崩溃了!描述一下你实行的思路或方法吧!

论坛徽章:
0
5 [报告]
发表于 2006-06-30 19:32 |只看该作者
别忘了+code啊

论坛徽章:
0
6 [报告]
发表于 2006-07-01 15:52 |只看该作者
帅哥,你这样不行的。你要把代码精简了以后在贴出来,这么长谁看呢。主要是原理讲清楚,几行代码表示一下就可以了,这样利于别人抓住重点

论坛徽章:
0
7 [报告]
发表于 2006-07-03 22:20 |只看该作者
写socket程序时,建议只用read和write,不要用什么recv和send。
能不能讲讲思路和问题,代码太长,不想看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP