#include "inet.h" #define EPORT 3001 void main() { int sockfd,newsockfd,childpid,clilen; struct sockaddr_in servaddr,cliaddr; if((sockfd=socket(AF_INET,SOCK_STREAM,0))<0) perror("socket error"); //bzero((char*)&servaddr,sizeof(servaddr)); servaddr.sin_family=AF_INET; servaddr.sin_addr.s_addr=htonl(INADDR_ANY); servaddr.sin_port=htons(EPORT); if(bind(sockfd,(struct sockaddr*)&servaddr,sizeof(servaddr))<0) perror("can't bind"); listen(sockfd,5); const int MAXLEN = 2048; cout << "\nFile Server started...\n" << flush; //int count=0; //char addr[100][500]; char file[100]; file[0]=0; int fi=0; while(1) { clilen=sizeof(cliaddr); newsockfd=accept(sockfd,(struct sockaddr*)&cliaddr,&clilen); if(newsockfd<0) perror("accept error"); if((childpid=fork())<0) perror(" fork error"); else if(childpid==0) //__ we are connected { //__compute new filename srandom(time(NULL)); char file[81]; for(int i=0;i<80;i++) { file[i]=65+random()%26; } file[80]=0; cout << endl << "Connected to : " << inet_ntoa(cliaddr.sin_addr) << endl << flush; char buf[2048]; char args[10][100]; close(sockfd); int catmode=0; fstream a; while(1) { int n=recv(newsockfd,buf,MAXLEN,0); if(n==0) { break; } else if(n<0) { perror("recv error"); break; } buf[n]=0; cout << "Received from "<< inet_ntoa(cliaddr.sin_addr) << " : " << buf << endl << flush; if(strncmp(buf,"exit",4)==0) { break; } //____break into words int i,j=0,k=0; j=k=0; for(i=0;i "); strcat(command,file); system(command); //___data is in filename fstream a; a.open(file,ios::in); while(a) { a.getline(buf,2048); strcat(buf,"\n"); //cout << "sending : " << buf << endl << flush; if(send(newsockfd,buf,strlen(buf),0)==-1) { perror("Send error"); break; } } buf[0]=26; buf[1]=0; if(send(newsockfd,buf,strlen(buf),0)==-1) { perror("Send error"); break; } } else if(strcmp(args[0],"cat")==0 || catmode) { char filename[80]; char command[400]; command[0]=0; if(catmode==0) //__ init file etc... { strcpy(filename,file); for(i=0;i<=j;i++) { strcat(command,args[i]); strcat(command," "); } strcat(command," > "); strcat(command,file); system(command); //___data is in filename a.close(); a.open(file,ios::in); catmode=1; } else { if(strncmp(args[0],"q",1)==0) // quit command catmode=0; } int count=0; while(a && catmode) { a.getline(buf,2048); strcat(buf,"\n"); //cout << "sending : " << buf << endl << flush; if(send(newsockfd,buf,strlen(buf),0)==-1) { perror("Send error"); break; } count++; if(count==24) { break; } } if(!a) { catmode=0; strcpy(buf,"File Transmission end.\n"); send(newsockfd,buf,strlen(buf),0); } else { strcpy(buf,"Press for more or q to quit\n"); send(newsockfd,buf,strlen(buf),0); } buf[0]=26; buf[1]=0; if(send(newsockfd,buf,strlen(buf),0)==-1) { perror("Send error"); break; } } else { strcpy(buf,"what was that !?\n"); if(send(newsockfd,buf,strlen(buf),0)==-1) { perror("Send error"); break; } buf[0]=26; buf[1]=0; if(send(newsockfd,buf,strlen(buf),0)==-1) { perror("Send error"); break; } } } // main while //__remove the temp file strcpy(buf,"rm "); strcat(buf,file); system(buf); cout << endl << "Connection closed to : " << inet_ntoa(cliaddr.sin_addr) << endl << flush; exit(0); } // new child close(newsockfd); } }