一个http代理的代码

实战:用泛微二开实现一个带Basic Auth认证的HTTP代理接口(附完整代码) 本文详细介绍了如何在泛微OA系统中通过二次开发实现带Basic Auth认证的HTTP代理接口。从环境准备、核心架构设计到HTTP工具类实现,提供了完整的代码示例和部署优化建议,帮助开发者高效解决跨系统对接时的认证难题。 阅读详情
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <winsock2.h>
#include <process.h>
#include <windows.h>
#include <assert.h>
#define  MAXBUFLEN  20480
#define  HTTPADDLEN 50
#define  TIMEWAIT   2000
SOCKET   Global[1000000];

void  DisplayBanner();
void  Proxy( void * pSocket);
int   ParseHttpRequest(char * SourceBuf,int DataLen,void * ServerAddr);
void  ParseError(char * ErrorMsg);

int main(int argc,char * argv[])
{
    SOCKET  MainSocket,ClientSocket;
    struct  sockaddr_in Host,Client;
    WSADATA WsaData;
    int  AddLen,i;

    //初始化
    DisplayBanner();
    if(WSAStartup(MAKEWORD(2,2),&WsaData) < 0)
    {
        printf("dll load errorn");
        exit(-1);
    }
    //创建socket端口
    MainSocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    if(MainSocket == SOCKET_ERROR)
    {
        ParseError("端口创建错误");
    }
    Host.sin_family = AF_INET;
    Host.sin_port = htons(8080);
    Host.sin_addr.s_addr = inet_addr("159.226.39.116");
    printf("正在工作n");
    //邦定
    if(bind(MainSocket,(SOCKADDR *)&Host,sizeof(Host)) != 0)
    {
        ParseError("邦定错误");
    }
    i = 0;
    //监听
    if(listen(MainSocket,5) == SOCKET_ERROR)
    {
        ParseError("监听错误");
    }
    AddLen = sizeof(Client);

    //连接新的客户
    i = 0;
    while(1)
    {
        ClientSocket = accept(MainSocket,(SOCKADDR *)&Client,&AddLen);
        if(ClientSocket == SOCKET_ERROR)
        {
            ParseError("接受客户请求错误");
        }
        printf(".");
        i ++ ;
        if( i >= 1000000)
            i = 0;
        Global[i] = ClientSocket;

        //对于每一个客户启动不同的进程进行控制
        //这个地方在使用ClientSocket的时候,要不要保证在某一时刻内只能有一个进程使用?    
        _beginthread(Proxy,0,(void *)&Global[i]);
        
    }

    

}
void Proxy( void * pSocket)
{
    SOCKET ClientSocket;
    char  ReceiveBuf[MAXBUFLEN];
    int  DataLen;
    struct sockaddr_in  ServerAddr;
    SOCKET  ProxySocket;
    int i = 0;
    int time = TIMEWAIT;

    //得到参数中的端口号信息
    ClientSocket = (SOCKET)* (SOCKET*)pSocket;
//接受第一次请求信息
    memset(ReceiveBuf,0,MAXBUFLEN);
    DataLen = recv(ClientSocket,ReceiveBuf,MAXBUFLEN,0);

    if(DataLen == SOCKET_ERROR)
    {
        ParseError("错误n");
        closesocket(ClientSocket);
        _endthread();
    }
    if(DataLen == 0)
    {
        closesocket(ClientSocket);
        _endthread();
    }    
    //处理请求信息,分离出服务器地址
    if( ParseHttpRequest(ReceiveBuf,DataLen,(void *)&ServerAddr) < 0)
    {
        closesocket(ClientSocket);
        goto error;
    }
    //创建新的socket用来和服务器进行连接
    ProxySocket = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    //设置超时时间
    setsockopt(ProxySocket,SOL_SOCKET,SO_RCVTIMEO,(char *)&time,sizeof(time));
    if(ProxySocket == SOCKET_ERROR)
    {
        ParseError("端口创建错误");
        _endthread();
    }
    if(connect(ProxySocket,(SOCKADDR *)&ServerAddr,sizeof(ServerAddr)) == SOCKET_ERROR)
    {
        //ParseError("连接服务器错误");
        goto error;
    }
    //开始进行数据传输处理
    //发送到服务器端
    if(send(ProxySocket,ReceiveBuf,DataLen,0) == SOCKET_ERROR)
    {
        //ParseError("数据发送错误");
        goto error;

    }
        //从服务器端接受数据
    while(DataLen > 0)
    {
        memset(ReceiveBuf,0,MAXBUFLEN);
    
        if((DataLen = recv(ProxySocket,ReceiveBuf,MAXBUFLEN,0)) <= 0)
        {
            //    ParseError("数据接受错误");
            break;
            
        }
        else
            //发送到客户端
            if(send(ClientSocket,ReceiveBuf,DataLen,0) < 0)
            {
                //    ParseError("数据发送错误");
                    break;
            }
        
    }
    
error:
    closesocket(ClientSocket);
    closesocket(ProxySocket);
    _endthread();
    return;

}
int  ParseHttpRequest(char * SourceBuf,int DataLen,void * ServerAddr)
{

    char * HttpHead = " http://";
    char * FirstLocation = NULL;
    char * LastLocation = NULL;
    char * PortLocation = NULL;
    char  ServerName[HTTPADDLEN];
    char  PortString[10];
    int   NameLen;
    struct hostent * pHost;
    struct sockaddr_in * pServer = (struct sockaddr_in *)ServerAddr;
    //取得 http://的位置
    FirstLocation = strstr(SourceBuf,HttpHead) + strlen(HttpHead);
    //取得/的位置
    LastLocation = strstr(FirstLocation,"/");

    //得到 http://和/之间的服务器的名称
    
    memset(ServerName,0,HTTPADDLEN);
    memcpy(ServerName,FirstLocation,LastLocation - FirstLocation);

    //有些情况下,请求的地址中带有端口号格式为“:+ 端口号”;
    //取得 :的位置
    PortLocation = strstr(ServerName,":");

    
    //填充server结构
    pServer->sin_family = AF_INET;
    //在url中制定了服务器端口
    if(PortLocation != NULL)
    {
        NameLen = PortLocation - ServerName -1;
        memset(PortString,0,10);
        memcpy(PortString,PortLocation + 1,NameLen);
        pServer->sin_port = htons((u_short)atoi(PortString));
        *PortLocation = 0;    
    }
    else//在url中,没有制定服务器端口
    {
        pServer->sin_port = htons(80);
    }

    if(NameLen > HTTPADDLEN)
    {
        ParseError("服务器名字太长");
        return -1;
    }
    
    //得到服务器信息
    //如果地址信息是以IP地址(202.194.7.1)的形式出现的
    if(ServerName[0] >= '0' && ServerName[0] <= '9')
    {
        
        pServer->sin_addr.s_addr = inet_addr(ServerName);
    }
    //以域名的形式出现的(www.sina.com.cn)
    else
    {
        pHost = (struct hostent *)gethostbyname(ServerName);
        if(!pHost)
        {
            printf("取得主机信息错误n");
            printf("%sn",ServerName);
            return -1;
        }
        memcpy(&pServer->sin_addr,pHost->h_addr_list[0],sizeof(pServer->sin_addr));
    }
    
    return 0;
}
void ParseError(char * ErrorMsg)
{
//    printf("%s %dn",ErrorMsg,GetLastError());
//    WSACleanup();
//    exit(-1);
}
void DisplayBanner()
{
    printf("=================================================n");
    printf("====                                         ====n");
    printf("====         HTTP PROXY v2.0                 ====n");
    printf("====        peijikui@ict.ac.cn               ====n");
    printf("====            Bug Patched                  ====n");
    printf("====            port 8080                    ====n");
    printf("====                                         ====n");
    printf("=================================================n");
}
Http/Https代理Python实现 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~对Python感兴趣,工作之余,参照部分文档初步实现了HTTP/HTTPs代理。(代码比较凌乱,各位留情。)使用Fiddler调试。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~import socket ... 阅读详情

相关推荐

一个简单的基于C语言的HTTP代理服务器的案例

一个简单的基于C语言的HTTP代理服务器的案例。这个代理服务器可以接收客户端的HTTP请求,并将请求转发到目标服务器,然后将服务器的响应返回给客户端。

MAMA6681的博客 1923

HTTP代理服务器的实现

接下来都是我对HTTP代理服务器的理解。 HTTP代理服务(proxy server) 器就是客户端也是服务端,是一个事务处理的中间人,就像下图所展示的一样, 图片来源于《HTTP权威...

DianaGreen7的博客 3万+

httpProxy 代理服务器源码

httpProxy,http/https代理服务器的源码,VC编译测试通过

JAVA写HTTP代理服务器-socket实现

HTTP代理服务器是一个中间服务器,它负责接收客户端的HTTP请求,然后将请求转发给目标服务器,并将目标服务器返回的响应返回给客户端。代理服务器可以处理各种HTTP请求,如GET、POST、PUT、DELETE等,并可以处理HTTPS请求。在开发Web应用程序时,使用代理服务器可以隐藏后端服务器的真实IP地址,增强安全性。

qq_41826150的博客 2776

简单HTTP代理服务器-源码c++

一个简单的http代理服务器。 支持http 和https c/c++源码。 代码易阅读和修改。供参考 经过测试,基本没有问题。

HTTP代理服务器源代码

代理服务器(Proxy)是网络信息的中转站,比方说HTTP代理服务器。我们使用网络浏览器直接链接其他Internet站点并取得网络信息时,需送出Request信号来得到回答,然后对方再把信息传送回来。代理服务器是介于浏览器和Web服务器之间的一台服务器,有了它之后,浏览器不是直接到Web服务器去取回网页而是向代理服务器发出请求,Request信号会先送到代理服务器,由代理服务器来取回浏览器所需要的信息并传送给你。而且大部分代理服务器都具有缓冲功能,就好像一个大Cache,它不断将新取得的数据包存到它本机的存储器上,如果浏览器所请求的数据在它本机的存储器上已经存在而且是最新的,那么它就不重新从Web服务器取数据,而直接将存储器上的数据传送给用户的浏览器,这样就能显著提高浏览速度和效率。

HTTP Proxy Demo代码示例

以上代码实现了一个简单的HTTP代理服务器,能够实现转发客户端的请求,并将目标服务器的响应转发给客户端。当客户端请求到达代理服务器时,代理服务器会将其转发到目标服务器上,然后将目标服务器的响应返回给客户端。

随便写写 1378

HTTP代理服务器软件和源代码

一款简单而且好用的HTTP代理服务器,采用visual studio 环境开发的

编写HTTP协议代理的一些知识(源码)

编写HTTP协议代理的一些知识(源码)

编程之道在明明德在亲民在止于至善 2331

Unity3D赛车游戏+脚本基础

本章主要介绍Unity的基础开发流程以及涉及到的概念。这个过程需要我们学会编写一些游戏脚本,在这讲的过程中我们会完成一个赛车小游戏,因此,在讲述这些基本概念和流程的时候,会同时涉及到一点脚本的开发基础.在游戏,电影和动画中,都有一个渲染的帧率,电影是24帧/s,游戏大概是30帧/s(当然也有60帧/s的)。在unity里面1秒钟,Update方法执行了30次。1秒钟有30帧,帧与帧之所消耗的时间是不一样的,那么我如何知道上一帧用了多少时间?Time.deltaTime就是为了解决这个问题。

m0_58367586的博客 7660

ArduSub深度调参指南:如何让水下机器人像鱼一样稳定游动

本文深入探讨了ArduSub水下机器人的深度调参策略,旨在解决ROV在水下晃动、响应迟钝等问题。文章系统解析了级联PID控制逻辑,并针对静水与水流环境,提供了具体的深度保持与姿态控制调参方法、实战日志分析技巧以及异常振荡处理方案,帮助用户实现水下机器人稳定、流畅的游动性能。

CAT789的专栏 373

Qwen2.5-Coder-1.5B惊艳案例:输入‘用Rust写一个并发HTTP代理’→完整可编译代码

本文介绍了如何在星图GPU平台上自动化部署Qwen2.5-Coder-1.5B镜像,高效生成专业级Rust代码。该模型可直接响应自然语言指令(如‘用Rust写一个并发HTTP代理’),输出结构清晰、带错误处理与并发控制的完整可编译代码,适用于开发原型、调试工具及工程化中间件。

weixin_36012152的博客 462

《湖科大教书匠计算机网络》学习笔记总目录+思维导图

本篇文章是对《湖科大教书匠计算机网络》所有知识点的笔记总结归档和计算机网络的思维导图

weixin_73077810的博客 8260

Python实现一个简单的HTTP代理

一个简单的HTTP代理

公羽向阳的博客 1万+

【智能制造】- APS系列|05 APS 排产的五大底层算法逻辑

很多人误以为APS只是给生产工单排先后顺序,实则整套系统依托成熟算法体系,完成多维度约束下的最优生产决策在制造业数字化排产普及的当下,依旧有不少制造管理者对APS存在认知误区,将其等同于简易工单排序工具。事实上,专业级高级计划与排程系统,早已脱离单纯按时间排序的基础功能,而是依托一整套成熟完善的底层算法逻辑,整合现场各类生产限制条件,在海量变量中自动推演、筛选、输出最贴合企业经营目标的生产方案。

qq_40821260的博客 436

SE模块理解+SE-Resnet模块pytorch实现

文章目录SE模块理解SE实现注意力机制原因SE-resnet网络pytorch实现定义residual定义SE模块 SE模块理解 SENet是Squeeze-and-Excitation Networks的简称,拿到了ImageNet2017分类比赛冠军,其效果得到了认可,其提出的SE模块思想简单,易于实现,并且很容易可以加载到现有的网络模型框架中。SENet主要是学习了channel之间的相关性,筛选出了针对通道的注意力,稍微增加了一点计算量,但是效果比较好。 SE模块广泛应用于去噪,去雨方向,利用SE模

qq_42754919的博客 2万+

python使用HTTP隧道代理代码示例模板

在上面的代码中,我们首先设置了代理服务器的地址和端口号,然后根据需要设置了代理服务器的用户名和密码,构造了代理服务器的认证信息。接着,我们构造了HTTP隧道代理,将其作为参数传递给`requests.get()`方法,同时将代理服务器的认证信息也作为参数传递给`requests.get()`方法。需要注意的是,如果代理服务器不需要认证,可以省略`proxy_auth`参数。另外,如果代理服务器只支持HTTP协议或者HTTPS协议,可以只设置`http`或`https`代理。# 构造代理服务器的认证信息。

weixin_73725158的博客 740

【五分钟论文笔记】Vision Banana:图像生成器成为通用视觉学习器

图像生成训练可以像 LLM 预训练一样,让模型学习强大且通用的视觉表示感知即生成——将视觉任务输出参数化为 RGB 图像,是一种优雅且强大的统一框架视觉理解能力可以在不牺牲生成能力的情况下获得——两者可以共存于同一个模型。

专注:太空算力、AI infra、异构调度、大模型成本工程 234

GO语言使用HTTP代理代码模版

在上面的代码中,我们首先创建了一个代理URL,然后创建了一个HTTP客户端,并将代理URL设置为客户端的代理。接下来,我们创建了一个HTTP请求,并使用客户端发送请求。最后,我们处理HTTP响应并打印响应状态。// 创建HTTP客户端。// 创建HTTP请求。// 发送HTTP请求。// 处理HTTP响应。// 创建代理URL。

weixin_73725158的博客 387

qtcreator使用远程服务器编译代码

我并没有找到很好的windows上可以用的rsync工具,最后是装了wsl来调用rsync同步到代码后,在用ssh调用linux命令来编译的。安装wsl安装ubuntu启动wsl然后把windows里的ssh文件证书和配置复制到wsl里同时config的key目录需要改一下,这样就可以登录服务器了然后在home目录创建build.sh进行远程编译。

习惯就好zz的专栏 1385

Autosar 下电过程-基于ETAS工具

本文介绍基于ETAS工具对应的BIP包的下电过程,仅供参考。在最后调用SBC下电时,需要理清楚SBC的休眠流程,否则可能会出现休眠又唤醒情况。后面有空会介绍9471的休眠流程。

赞的博客 815

使用Node实现Http代理

代理的出现是因为浏览器同源策略的存在 服务端实现代理的例子和方法很多 比如nginx 反向代理解决生产环境的跨域问题 再有http-server等一些第三方的包帮我处理 基本达到了开箱即用的体验 通常我们所说的代理来源于http1.1的定义,代理扮演的是「中间人」角色,对于连接到它的客户端来说,它是服务端;对于要连接的服务端来说,它是客户端。它就负责在两端之间来回传送 HTTP 报文 假如我通过代...

qq_37653449的博客 3546

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

使用 C# 7 语言编写匿名的 HTTP-PROXY 正向代理服务器【匿名代理:无账密验证】

该代理实现是正确精简的,你可以基于该代码的基础上进行优化,HTTP代理实际上也有很多隐藏的坑点,如果你正在编写一个正向代理服务器,发现了例如:从一个网卡打开到另外一个网页,该网页打开会造成 HTTP-503 之类的错误,可以参见本文列出正向代理代码。 该代理的源代码摘要自 PPP,网络基础库;;值得一提该代理实现提供了对于:HTTP隧道转发、HTTP明文代理的支持;这意味着,通过HTTP隧道代理访问的TCP连接,并不会区分TCP流的协议类型。一般浏览器之中 HTTPS 请求走 HTTP代...

liulilittle的博客 1479

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

正确的使用HTTP代理

HTTP代理对于网络爬虫是一种很常见的协议,HTTP代理协议也是大数据时代不可缺少的一部分。HTTP代理在网络爬虫中发挥出了他大量用途。HTTP代理其实有许多用途,例如:刷票,爬虫,抢单,刷单,等等一系列业务 都适合HTTP代理。其实对于网络爬虫工作来着说,许多网络工作者都不知道如何使用HTTP代理。那么如何才能正确使用HTTP代理呢? 1、大数据时代,各类网站的限制,限制爬虫,限制访问等导致无法访问和获取数据,这对爬虫用户就会产生极大的影响,这是网络爬虫用户就会运行HTTP代理来完成这些工作。网络爬虫需要

Laicaling的博客 282

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java 使用代理发送Http请求 (将Http请求代理Https请求)

package com.test.porxy; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.PrintWriter; import jav...

weixin_34161032的博客 3174

Golang 设置http代理

go POST请求的时候设置http代理,代码直接贴出来。

博士的BLOG 4026
上一篇: 如何显示Windows标准"运行"对话框
下一篇: Award版Bios内部结构及加载过程简单说明
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值