服务器端的程序一般有如下几个过程,首先是bind,然后再是listen,最后是accept。再往后就是客户端与服务器连接后的各种操作了。

相比之下,客户端的程序就比较简单了,只需先获得sock_id,再与对应的sock进行connect,其他如下。

服务器端代码:

 #include<stdio.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#include<time.h>
#include<string.h>
#define PORTNUM 15000
#define HOSTLEN 256
#define oops(msg) {printf("error:%s\n",msg);return 1;}
int main(int ac,char * av[]){
struct sockaddr_in saddr;
struct hostent * hp;
char hostname[HOSTLEN];
int sock_id,sock_fd;
FILE * sock_fpi,* sock_fpo;
FILE * pipe_fp;
char dirname[BUFSIZ];
char command[BUFSIZ];
int dirlen,c;
sock_id=socket(PF_INET,SOCK_STREAM,);//set socket
if(sock_id==-)
oops("socket");
bzero((void *)&saddr,sizeof(saddr));//empty saddr
gethostname(hostname,HOSTLEN);
printf("hostname:%s\n",hostname);
hp=gethostbyname(hostname);
bcopy((void *)hp->h_addr,(void *)&saddr.sin_addr,hp->h_length);
saddr.sin_port=htons(PORTNUM);
saddr.sin_family=AF_INET;
if(bind(sock_id,(struct sockaddr *)&saddr,sizeof(saddr))!=)//bind address
oops("bind");
if(listen(sock_id,)!=)//listen
oops("listen");
while(){
sock_fd=accept(sock_id,NULL,NULL);//start accept
if(sock_fd==-)
oops("accept");
if((sock_fpi=fdopen(sock_fd,"r"))==NULL)
oops("fdopen reading");
if(fgets(dirname,BUFSIZ-,sock_fpi)==NULL)
oops("reading dirname");
sanitize(dirname);
if((sock_fpo=fdopen(sock_fd,"w"))==NULL)
oops("fdopen writing");
sprintf(command,"ls %s",dirname);
if((pipe_fp=popen(command,"r"))==NULL)
oops("popen");
while((c=getc(pipe_fp))!=EOF)
putc(c,sock_fpo);
pclose(pipe_fp);
pclose(sock_fpo);
pclose(sock_fpi);
}
}
sanitize(char * str){
char * src,* dest;
for(src=dest=str;*src;src++)
if(*src=='/'||isalnum(*str))
*dest++=*src;
*dest='\0';
}

客户端代码:

 #include<stdio.h>
#include<linux/types.h>
#include<sys/socket.h>
#include<netinet/in.h>
#include<netdb.h>
#define oops(msg) {printf("error:%s\n",msg);return 1;}
#define PORTNUM 15000
main(int ac,char * av[]){
struct sockaddr_in servadd;
struct hostent * hp;
int sock_id,sock_fd;
char message[BUFSIZ];
char buffer[BUFSIZ];
int messlen,n_read;
sock_id=socket(PF_INET,SOCK_STREAM,);//attention:PF_INT NOT AF_INT
if(sock_id==-)
oops("socket");
bzero(&servadd,sizeof(servadd));
hp=gethostbyname(av[]);
if(hp==NULL)
oops(av[]);
bcopy(hp->h_addr,(struct sockaddr *)&servadd.sin_addr,hp->h_length);
servadd.sin_port=htons(PORTNUM);
servadd.sin_family=AF_INET;
if(connect(sock_id,(struct sockaddr *)&servadd,sizeof(servadd))!=)//connect
oops("connect");
if(write(sock_id,av[],strlen(av[]))==-)
oops("write");
if(write(sock_id,"\n",)==-)
oops("write");
while((n_read=read(sock_id,buffer,BUFSIZ))>)
if(write(,buffer,n_read)==-)
oops("write");
close(sock_id);
}

调用如下:

服务器启动:./rlsd&

客户端访问:./rls jsonzhang-Vostro-23-3340 ~/桌面/workplace/

rls与rlsd的更多相关文章

  1. RLS自适应滤波器中用矩阵求逆引理来避免求逆运算

    在RLS自适应滤波器的实现过程中,难免不涉及矩阵的求逆运算.而求逆操作双是非常耗时的,一个很自然的想法就是尽可能的避免直接对矩阵进行求逆运算.那么,在RLS自适应滤波器的实现中,有没有一种方法能避免直 ...

  2. Power BI 行级别安全性 (RLS)

    在 Power BI Desktop 中定义角色和规则 你可以在 Power BI Desktop 中定义角色和规则. 发布到 Power BI 时,它还会发布角色定义. 若要定义安全角色,请执行以下 ...

  3. Power BI 报表服务器中的行级别安全性 (RLS)

    在 Power BI Desktop 中定义角色和规则 你可以在 Power BI Desktop 中定义角色和规则. 发布到 Power BI 时,它还会发布角色定义. 若要定义安全角色,请执行以下 ...

  4. PowerBI开发 第十八篇:行级安全(RLS)

    PowerBI可以通过RLS(Row-level security)限制用户对数据的访问,过滤器在行级别限制数据的访问,用户可以在角色中定义过滤器,通过角色来限制数据的访问.在PowerBI Serv ...

  5. 数据权限筛选(RLS)的两种实现介绍

    在应用程序中,尤其是在统计的时候, 需要使用数据权限来筛选数据行. 简单的说,张三看张三部门的数据, 李四看李四部门的数据:或者员工只能看自己的数据, 经理可以看部门的数据.这个在微软的文档中叫Row ...

  6. Envoy熔断限流实践(二)Rainbond基于RLS服务全局限流

    Envoy 可以作为 Sevice Mesh 微服务框架中的代理实现方案,Rainbond 内置的微服务框架同样基于 Envoy 实现.本文所描述的全局限速实践也是基于 Envoy 已有的方案所实现. ...

  7. In-Memory:在内存中创建临时表和表变量

    在Disk-Base数据库中,由于临时表和表变量的数据存储在tempdb中,如果系统频繁地创建和更新临时表和表变量,大量的IO操作集中在tempdb中,tempdb很可能成为系统性能的瓶颈.在SQL ...

  8. Security Policy:行级安全(Row-Level Security)

    行级安全RLS(Row-Level Security)是在数据行级别上控制用户的访问,控制用户只能访问数据库表的特定数据行.断言是逻辑表达式,在SQL Server 2016中,RLS是基于安全断言( ...

  9. Sql Server 2016新功能之 Row-Level Security

    Sql Server 2016 有一个新功能叫 Row-Level Security ,大概意思是行版本的安全策略(原来我是个英语渣_(:з」∠)_) 直接上例子.这个功能相当通过对表添加一个函数作为 ...

随机推荐

  1. Java:类的构造函数

    类的构造函数   类的构造函数特点: 1. 构造函数也称为构造方法,构造函数名和类名相同.     2. 构造函数不能有返回值,也不能用void声明. 3. 构造函数可以有参数,也可以无参数,在一个类 ...

  2. div盒子水平垂直居中方法

    文章转载自:div盒子水平垂直居中的方法 - 雪明瑶 这个问题比较老,方法比较多,各有优劣,着情使用. 一.盒子没有固定的宽和高 方案1.Transforms 变形 这是最简单的方法,不仅能实现绝对居 ...

  3. leetcode — remove-element

    /** * Source : https://oj.leetcode.com/problems/remove-element/ * * Created by lverpeng on 2017/7/12 ...

  4. 使用centos 7安装conpot

    使用CentOS的版本7.3和Conpot 0.5.1(也可能适用于其他CentOS的版本) 1.通过ssh登录系统,并需要具有足够的系统特权(e.g root) 2.系统升级 yum -y upda ...

  5. netty源码解解析(4.0)-6 线程模型-IO线程EventLoopGroup和NIO实现(一)

    接口定义 io.netty.channel.EventLoopGroup extends EventExecutorGroup 方法 说明 ChannelFuture register(Channel ...

  6. 鸟哥的Linux私房菜:基础学习篇 —— 第五章笔记

    1.Linux一般将文件可存取的身份分为三个类 别,分别是 owner/group/others,且三种身份各有 read/write/execute 等权限.其中 root 的权限最高. 2.在我们 ...

  7. c++中虚析构函数

    当指向基类的指针指向新建立的派生类对象而且基类和派生类都调用new向堆申请空间时,必须将基类的析构函数声明为虚函数,从而派生类的析构函数也为虚函数,这样才能在程序结束时自动调用它,从而将派生类对象申请 ...

  8. IOS 获取的时间显示为NAN 解决方法

    var regTime= item.BeginDate.replace(/\-/g, "/"); ------ item.BeginDate 我的日期年月日的    (/\-/g, ...

  9. c#cookie读取写入操作

    public static void SetCookie(string cname, string value, int effective) { HttpCookie cookie = new Ht ...

  10. C#基础 数据类型 类型转换

    本节主要讲解数据类型和各类型之间的转换,两点都是重点,难点在于各种转换的活学活用. 一   数据类型 (一)基本数据类型 1  值类型 (1)整形         int                ...