远程终端(初稿)

来源:互联网 发布:linux重启网卡编程 编辑:程序博客网 时间:2024/04/28 10:47
服务端:#include <stdio.h>#include <stdlib.h>#include <netinet/in.h>#include <string.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/select.h>#include <sys/types.h>#include <sys/time.h>#include <string.h>#define MAX 100typedef struct sockaddr SA;int main(){int listenfd,connfd;struct sockaddr_in myaddr;fd_set global_rdfs,current_rdfs;int maxfd;int i,opt = 1;char buf[MAX];int nbyte;int a[10] = {0};int num = 0;int socklen = sizeof(myaddr);char buf1[MAX] = "server : ";    FILE *fp1;if((listenfd = socket(AF_INET,SOCK_STREAM,0)) < 0){perror("socket error");exit(-1);}if(setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,&opt,sizeof(opt)) < 0){perror("setsockopt error");exit(-1);}bzero(&myaddr,sizeof(myaddr));myaddr.sin_family = AF_INET;myaddr.sin_addr.s_addr = inet_addr("127.0.0.1");myaddr.sin_port = htons(8888);if(bind(listenfd,(SA*)&myaddr,sizeof(myaddr)) < 0){perror("bind error");exit(-1);}listen(listenfd,5);FD_ZERO(&global_rdfs);FD_SET(STDIN_FILENO,&global_rdfs);FD_SET(listenfd,&global_rdfs);maxfd = listenfd;while(1){current_rdfs = global_rdfs;if(select(maxfd+1,¤t_rdfs,NULL,NULL,0) < 0){perror("select error");exit(-1);}else{for(i = 0;i<=maxfd;i++){if(FD_ISSET(i,¤t_rdfs)){if(i == listenfd){a[num] = accept(listenfd,(SA*)&myaddr,&socklen);FD_SET(a[num],&global_rdfs);maxfd = maxfd>a[num]?maxfd:a[num];num++;}else{     memset(buf,0,200);if((nbyte = recv(i,buf,sizeof(buf),0)) <=0){close(i);FD_CLR(i,&global_rdfs);}else{ if(strncmp(buf,"cd",2)==0){          strtok(buf," ");      fflush(stdout);     chdir(strtok(NULL," ")); }   else{  if((fp1 = popen(buf,"r")) == NULL)  {perror("error1");exit(1); }                memset(buf,0,200);                while(fgets(buf,100,fp1)!=NULL)                 {                            printf("%s",buf);                       send(i,buf,sizeof(buf),0);                  }                                                              }}}}}}}}

客户端#include <stdio.h>#include <stdlib.h>#include <netinet/in.h>#include <string.h>#include <arpa/inet.h>#include <unistd.h>#include <sys/select.h>#include <sys/types.h>#include <sys/time.h>#define MAXLINE 50typedef struct sockaddr SA;int main(int argc,char **argv){int sockfd,connfd;struct sockaddr_in servaddr;fd_set global_rdfs,current_rdfs;int maxfd;int i;char buf[MAXLINE];int nbyte;int socklen = sizeof(servaddr);if((sockfd = socket(AF_INET,SOCK_STREAM,0)) < 0){perror("socket error");exit(-1);}bzero(&servaddr,sizeof(servaddr));servaddr.sin_family = AF_INET;servaddr.sin_addr.s_addr = inet_addr("127.0.0.1");servaddr.sin_port = htons(8888);if(connect(sockfd,(SA*)&servaddr,sizeof(servaddr)) < 0){perror("fail to revcv");exit(-1);}FD_ZERO(&global_rdfs);FD_SET(STDIN_FILENO,&global_rdfs);FD_SET(sockfd,&global_rdfs);maxfd = sockfd;while(1){current_rdfs = global_rdfs;if(select(maxfd+1,¤t_rdfs,NULL,NULL,0) < 0){perror("select error");exit(-1);}else{for(i = 0;i<=maxfd;i++){if(FD_ISSET(i,¤t_rdfs)){if(i ==STDIN_FILENO){fgets(buf,sizeof(buf),stdin);buf[strlen(buf)-1]='\0';send(sockfd,buf,sizeof(buf),0);}else if(i == sockfd)if((nbyte = recv(sockfd,buf,sizeof(buf),0)) <=0){close(i);FD_CLR(i,&global_rdfs);}else{        printf("%s",buf);}}}}}return 0;}