使用本地套接字实现无血缘关系的进程间的通信

文件格式:
○ 管道: p
○ 套接字
伪文件

头文件: sys/un.h
#define UNIX_PATH_MAX 108
__kernel_sa_family_t sun_family;
char sun_path[UNIX_PATH_MAX];
struct sockaddr_un {
};

服务器端

创建套接字socket
绑定bind
设置监听listen
等待接收连接请求accept
通信send/recv
断开连接close

客户端

创建套接字socket
绑定一个套接字文件bind
连接服务器connect
通信send/recv
断开连接close

server.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <sys/stat.h>
#include <sys/un.h>

int main(int argc, char **argv)
{
    int lfd = socket(AF_LOCAL, SOCK_STREAM, 0);
    if (lfd == -1)
    {
	perror("socket error");
	exit(1);
    }
    unlink("server.socket");
    //绑定
    struct sockaddr_un server;
    server.sun_family = AF_LOCAL;
    sprintf(server.sun_path, "%s", "server.socket");
    int ret = bind(lfd, (struct sockaddr *)&server, sizeof(server));
    if (ret == -1)
    {
	perror("bind error");
	exit(1);
    }
    //监听
    ret = listen(lfd, 128);
    if (ret == -1)
    {
	perror("listen error");
	exit(1);
    }
    //等待接收连接请求
    struct sockaddr_un client;
    socklen_t client_len = sizeof(client);
    int cfd = accept(lfd, (struct sockaddr *)&client, &client_len);
    if (cfd == -1)
    {
	perror("accept error");
	exit(1);
    }
    printf("client server name : %s\n", client.sun_path);
    //通信
    while (1)
    {
	char buf[1024] = { 0 };
	int len = recv(cfd, buf, sizeof(buf), 0);
	if (len == -1)
	{
	    perror("recv error");
	    exit(1);
	}
	else if (len == 0)
	{
	    printf("客户端断开了连接\n");
	    break;
	}
	else
	{
	    printf("recv buf : %s\n", buf);
	    send(cfd, buf, len, 0);
	}
    }
    close(lfd);
    close(cfd);
    return 0;
}

client.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/types.h>
#include <arpa/inet.h>
#include <ctype.h>
#include <sys/stat.h>
#include <sys/un.h>

int main(int argc, char **argv)
{
    //创建套接字
    int fd = socket(AF_LOCAL, SOCK_STREAM, 0);
    if (fd == -1)
    {
	perror("socket error");
	exit(1);
    }
    unlink("client.socket");
    //给客户端绑定套接字文件
    struct sockaddr_un client;
    client.sun_family = AF_LOCAL;
    sprintf(client.sun_path, "%s", "client.socket");
    int ret = bind(fd, (struct sockaddr *)&client, sizeof(client));
    if (ret == -1)
    {
	perror("bind error");
	exit(1);
    }
    //初始化服务器信息
    struct sockaddr_un server;
    server.sun_family = AF_LOCAL;
    sprintf(server.sun_path, "%s", "server.socket");
    //连接服务器
    ret = connect(fd, (struct sockaddr *)&server, sizeof(server));
    if (ret == -1)
    {
	perror("connect error");
	exit(1);
    }
    //通信
    while (1)
    {
	char buf[1024] = { 0 };
	fgets(buf, sizeof(buf), stdin);
	send(fd, buf, strlen(buf)+1, 0);
	//接收数据
	recv(fd, buf, sizeof(buf), 0);
	printf("recv buf: %s\n", buf);
    }
    close(fd);
    return 0;
}

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Druid是一款数据库连接池和监控平台,可以对SQL进行解析,帮助我们实现血缘关系计算。 首先,需要在项目中引入Druid的相关依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.2.6</version> </dependency> ``` 接着,我们可以通过Druid提供的`Parser`类来解析SQL语句: ```java import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; import com.alibaba.druid.sql.visitor.SchemaStatVisitor; public class SqlParser { public static void parseSql(String sql) { // 解析SQL,获取AST MySqlStatementParser parser = new MySqlStatementParser(sql); SQLStatement statement = parser.parseStatement(); // 获取查询语句部分 SQLSelectStatement selectStatement = (SQLSelectStatement)statement; // 获取AST中的表名和列名 SchemaStatVisitor visitor = new SchemaStatVisitor(); selectStatement.accept(visitor); System.out.println(visitor.getColumns()); System.out.println(visitor.getTables()); } } ``` 以上代码中,我们首先使用`MySqlStatementParser`类解析SQL语句,然后通过`SchemaStatVisitor`访问AST中的表名和列名,从而获取血缘关系。 需要注意的是,Druid只能解析SQL语句,无法在运行时获取真实的数据表和列名,因此我们需要在代码中手动指定表和列的信息,以便进行血缘关系计算。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值