• 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
    ",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
    ",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='';
    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
    ",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,"
    ",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/

  • 相关阅读:
    详细解说仿制QQ列表 展开和收起列表
    带大家一步一步封装聊天键盘(三)新增功能不要错过哟
    带大家一步一步封装一个聊天键盘(二)
    带大家一步一步的封装一个聊天键盘(一)
    iOS中的屏幕适配之Autolayout(初级)
    iOS开发中tableViewCell的悬浮效果
    [Leetcode] 1343. Maximum Product of Splitted Binary Tree | 分裂二叉树的最大乘积
    [Leetcode] 560. Subarray Sum Equals K | 和为K的子数组
    爆炸!iOS资源大礼包(持续更新...)
    Objective-C探究alloc方法的实现
  • 原文地址:https://www.cnblogs.com/JsonZhangAA/p/8653570.html
Copyright © 2020-2023  润新知