rls与rlsd

服务器端的程序一般有如下几个过程,首先是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 15000
10 #define HOSTLEN 256
11 #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 socket
23     if(sock_id==-1)
24         oops("socket");
25     bzero((void *)&saddr,sizeof(saddr));//empty saddr
26     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 address
33         oops("bind");
34     if(listen(sock_id,1)!=0)//listen
35         oops("listen");
36     while(1){
37         sock_fd=accept(sock_id,NULL,NULL);//start accept
38         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_INT
16     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)//connect
26         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/

posted @ 2018-03-26 20:34  张杨  阅读(914)  评论(0编辑  收藏  举报