rls與rlsd,rlsrlsd

來源:互聯網
上載者:User

rls與rlsd,rlsrlsd

伺服器端的程式一般有如下幾個過程,首先是bind,然後再是listen,最後是accept。再往後就是用戶端與伺服器串連後的各種操作了。

相比之下,用戶端的程式就比較簡單了,只需先獲得sock_id,再與對應的sock進行connect,其他如下。

伺服器端代碼:

 1 #include<stdio.h> 2 #include<unistd.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<netinet/in.h> 6 #include<netdb.h> 7 #include<time.h> 8 #include<string.h> 9 #define PORTNUM 1500010 #define HOSTLEN 25611 #define oops(msg) {printf("error:%s\n",msg);return 1;}12 int main(int ac,char * av[]){13     struct sockaddr_in saddr;14     struct hostent * hp;15     char hostname[HOSTLEN];16     int sock_id,sock_fd;17     FILE * sock_fpi,* sock_fpo;18     FILE * pipe_fp;19     char dirname[BUFSIZ];20     char command[BUFSIZ];21     int dirlen,c;22     sock_id=socket(PF_INET,SOCK_STREAM,0);//set socket23     if(sock_id==-1)24         oops("socket");25     bzero((void *)&saddr,sizeof(saddr));//empty saddr26     gethostname(hostname,HOSTLEN);27     printf("hostname:%s\n",hostname);28     hp=gethostbyname(hostname);29     bcopy((void *)hp->h_addr,(void *)&saddr.sin_addr,hp->h_length);30     saddr.sin_port=htons(PORTNUM);31     saddr.sin_family=AF_INET;32     if(bind(sock_id,(struct sockaddr *)&saddr,sizeof(saddr))!=0)//bind address33         oops("bind");34     if(listen(sock_id,1)!=0)//listen35         oops("listen");36     while(1){37         sock_fd=accept(sock_id,NULL,NULL);//start accept38         if(sock_fd==-1)39             oops("accept");40         if((sock_fpi=fdopen(sock_fd,"r"))==NULL)41             oops("fdopen reading");42         if(fgets(dirname,BUFSIZ-5,sock_fpi)==NULL)43             oops("reading dirname");44         sanitize(dirname);45         if((sock_fpo=fdopen(sock_fd,"w"))==NULL)46             oops("fdopen writing");47         sprintf(command,"ls %s",dirname);48         if((pipe_fp=popen(command,"r"))==NULL)49             oops("popen");50         while((c=getc(pipe_fp))!=EOF)51             putc(c,sock_fpo);52         pclose(pipe_fp);53         pclose(sock_fpo);54         pclose(sock_fpi);55     }56 }57 sanitize(char * str){58     char * src,* dest;59     for(src=dest=str;*src;src++)60         if(*src=='/'||isalnum(*str))61             *dest++=*src;62     *dest='\0';63 }

用戶端代碼:

 1 #include<stdio.h> 2 #include<linux/types.h> 3 #include<sys/socket.h> 4 #include<netinet/in.h> 5 #include<netdb.h> 6 #define oops(msg) {printf("error:%s\n",msg);return 1;} 7 #define PORTNUM 15000 8 main(int ac,char * av[]){ 9     struct sockaddr_in servadd;10     struct hostent * hp;11     int sock_id,sock_fd;12     char message[BUFSIZ];13     char buffer[BUFSIZ];14     int messlen,n_read;15     sock_id=socket(PF_INET,SOCK_STREAM,0);//attention:PF_INT NOT AF_INT16     if(sock_id==-1)17         oops("socket");18     bzero(&servadd,sizeof(servadd));19     hp=gethostbyname(av[1]);20     if(hp==NULL)21         oops(av[1]);22     bcopy(hp->h_addr,(struct sockaddr *)&servadd.sin_addr,hp->h_length);23     servadd.sin_port=htons(PORTNUM);24     servadd.sin_family=AF_INET;25     if(connect(sock_id,(struct sockaddr *)&servadd,sizeof(servadd))!=0)//connect26         oops("connect");27     if(write(sock_id,av[2],strlen(av[2]))==-1)28         oops("write");29     if(write(sock_id,"\n",1)==-1)30         oops("write");31     while((n_read=read(sock_id,buffer,BUFSIZ))>0)32         if(write(1,buffer,n_read)==-1)33             oops("write");34         close(sock_id);35 }

調用如下:

伺服器啟動:./rlsd&

用戶端訪問:./rls jsonzhang-Vostro-23-3340 ~/案頭/workplace/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.