socket关联查询
反向代理服务器面对用户请求和后端服务器响应,需要将两者联系起来,于是就涉及到socket关联查询了。
代理服务器处理用户的请求和后端服务器的响应,并且这两方的请求和响应是相互对应的,因此对于代理接收到服务器的响应该如何找到这个响应对应的用户请求;甚至代理在处理一个socket描述符时,如何确定是发送给用户的响应,还是发给后端服务器的请求。
我提出来的方案是
socket关联查询整体模型如下图所示:

socket关联查询整体模型
为了建立代理对客户端的请求与后端服务器的响应,建立一个映射哈希表。socket关联查询详细模型如图所示:

socket关联查询详细模型
1、用户请求连接时,先加入到epoll中,建立连接后,并且有请求任务到来时,将该任务加入到线程池,即对fdc进行操作;
2、当用户实际上是与后端服务器交互时,代理需要与后端服务器建立连接,这时需要创建一个fds,这时将以fdc和fds为关键字加入到哈希表中;
3、当后端服务器有响应时,加入到epoll中;当有响应任务时,加入到线程池处理响应任务;
4、当代理需要将后端服务器的响应再次响应给用户时,查询匹配哈希表,即可找到fds与fdc的映射,这样就能正确的对该请求的用户进行响应。
对于哈希表的设计,下面又给出实验代码:当然具体实现还待将代理的功能实现在将这个整合。代码如下:
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h> #define HASHSIZE 997
#define C_S 2
#define S_C 1
typedef struct _Node Node;
typedef struct _Hash Hash;
struct _Node{
int value;
int fds;
int fdc;
/* conn_staut=1表示ref_fd=fds,代理把数据发送给fdc
* conn_staut=2表示ref_fd=fdc,代理把数据发送给fds */
int conn_staut;
Node *next;
}; struct _Hash{
int key;
Node *next;
}; static Hash hash[HASHSIZE]; /* 哈希函数 */
int hash_fun(int ref_fd)
{
return ref_fd % HASHSIZE;
} /* 初始化哈希表 */
void hash_init()
{
int i = ;
for(i = ; i < HASHSIZE; i++)
{
hash[i].key = ;
hash[i].next = NULL;
}
} /* 哈希节点的匹配 */
Node*
hash_fdmate(int ref_fd)
{
int hash_val;
hash_val = hash_fun(ref_fd); if(hash[hash_val].next == NULL)
return NULL; Node *p = hash[hash_val].next;
for(; p->next == NULL; p = p->next)
{
if(ref_fd == p->fds || ref_fd == p->fdc)
{
return p;
}
}
return NULL;
} /* 哈希节点的插入 */
Node*
hash_insert(int fdc, int fds)
{
Node *node_c = (Node *)malloc(sizeof(Node));
Node *node_s = (Node *)malloc(sizeof(Node));
if(node_c == NULL || node_s == NULL)
return NULL;
bzero(node_c, sizeof(Node));
bzero(node_s, sizeof(Node)); node_c->fds = fds;
node_c->fdc = fdc;
node_c->conn_staut = C_S; node_s->fds = fds;
node_s->fdc = fdc;
node_s->conn_staut = S_C; /* 先以fdc加入到哈希表中 */
int hash_val;
hash_val = hash_fun(fdc);
if(hash[hash_val].next == NULL)
{
hash[hash_val].next = node_c;
}else
{
node_c->next = hash[hash_val].next;
hash[hash_val].next = node_c;
} /* 先以fds加入到哈希表中 */
hash_val = hash_fun(fds);
if(hash[hash_val].next == NULL)
{
hash[hash_val].next = node_s;
}else
{
node_s->next = hash[hash_val].next;
hash[hash_val].next = node_s;
}
return node_c;
} /* 销毁整哈希表*/
void
hash_destroy()
{ } /* 删除哈希中的某个节点 */
Node*
hash_delete(int ref_fd)
{ } #if 1
int main(void)
{
int fdc = ;
int fds = ; hash_init();
hash_insert(fdc, fds); Node *np = hash_fdmate();
if(np == NULL)
{
printf("no find!\n");
return ;
}
printf("%d\n", np->conn_staut);
return ;
} #endif
socket关联查询的更多相关文章
- JDBC MySQL 多表关联查询查询
public static void main(String[] args) throws Exception{ Class.forName("com.mysql.jdbc.Driver&q ...
- MYSQL基础操作之数据约束与关联查询
一.MYSQL约束 1.默认值约束,当字段没有插入值的时候,mysql自动给该字段分配默认值. 默认值的字段允许为空. 对默认值字段也可以插入null. CREATE TABLE STUDENT( I ...
- C#代码中实现两个表(DataTable)的关联查询(JOIN)
之前通常都是使用SQL直接从数据库中取出表1和表2关联查询后的数据,只需要用一个JOIN就可以了,非常方便.近日遇到一种情况,两个表中的数据已经取到代码中,需要在代码中将这两个表关联起来,并得到它们横 ...
- Mybatis关联查询和数据库不一致问题分析与解决
Mybatis关联查询和数据库不一致问题分析与解决 本文的前提是,确定sql语句没有问题,确定在数据库中使用sql和项目中结果不一致. 在使用SpringMVC+Mybatis做多表关联时候,发现也不 ...
- Mysql多表表关联查询 inner Join left join right join
Mysql多表表关联查询 inner Join left join right join
- YII2-数据库数据查询方法,关联查询with, joinWith区别和分页
一.ActiveRecord 活动记录 1.with关联查询 例如,查询评论 $post = Post::find()->with('comments'); 等价于以下结果集 SELECT * ...
- Mybatis高级查询之关联查询
learn from:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html#Result_Maps 关联查询 准备 关联结果查询(一对一) resul ...
- Spring+MyBatis框架中sql语句的书写,数据集的传递以及多表关联查询
在很多Java EE项目中,Spring+MyBatis框架经常被用到,项目搭建在这里不再赘述,现在要将的是如何在项目中书写,增删改查的语句,如何操作数据库,以及后台如何获取数据,如何进行关联查询,以 ...
- [NHibernate]一对多关系(关联查询)
目录 写在前面 文档与系列文章 一对多查询 总结 写在前面 上篇文章介绍了nhibernate的一对多关系如何配置,以及级联删除,级联添加数据的内容.这篇文章我们将学习nhibernate中的一对多关 ...
随机推荐
- SSIS自定义数据流组件开发(血路)
由于特殊的原因(怎么特殊不解释),需要开发自定义数据流组件处理. 查了很多资料,用了不同的版本,发现各种各样的问题没有找到最终的解决方案. 遇到的问题如下: 用VS2015编译出来的插件,在SSDTB ...
- SQLSERVER 复制同一张表的递归结构
CREATE PROCEDURE [dbo].[Pro_Copy] @OLDJiFenSeriesId VARCHAR(), @NEWJiFenSeriesId VARCHAR() AS BEGIN ...
- RAID简介
RAID(独立磁盘冗余阵列)可以提供较普通磁盘更高的速度,安全性,所以服务器在安装时会选择创建RAID.RAID的创建有两种方式:软RAID(通过操作系统软件来实现)和硬raid(使用硬件整列卡) r ...
- .NET的Cookie相关操作
using System; using System.Collections.Generic; using System.Text; using System.Web; namespace Comm ...
- flex 布局 初次接触这个好使又不是特别好用的布局方法
刚开始学前端的童鞋们应该也是一样先学习的table然后再学习了盒子模型,感觉终于学会了简单的网页布局,使用各种display,float,position绞尽脑汁给页面布局成自己想要的页面样式,然而, ...
- SpringMVC中使用Json传数据
在web项目中使用Json进行数据的传输是非常常见且有用的,在这里介绍下在SpringMVC中使用Json传数据的一种方法,在我的使用中,主要包括下面四个部分(我个人喜好使用maven这类型工具进行项 ...
- 处理ios webview 更新缓存本地css、js后webview缓存无法更新的问题
项目中需要使用app本地css.js,并且可以根据服务下发自动更新本地css.js.测试发现只要更新后的css或者js和更新前路径一致,webview加载的还是更新前的css.js.怀疑是webvie ...
- double精度问题
一个Double值由2个Double相加,比如明明是91.2 + 2.4,结果应为93.6,为什么结果是93.6000000000001 为什么会无端地在小数点后面加很多个0,最后还是一个1 ? 计算 ...
- WAMP虚拟目录的设置
1.打开Apache的配置文件httpd.conf,并去掉#Include conf/extra/httpd-vhosts.conf前面的#!! 2.打开Apache的apache/conf/extr ...
- vue.js 2.0开发(4)
使用vue-cli,首先安装: npm install -g vue-cli 安装完了执行vue命令,会出现 vue init <template-name> <project-na ...