问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

怎么用socket访问http代理服务器,需要账号密码验证

发布网友 发布时间:2022-04-22 06:07

我来回答

1个回答

热心网友 时间:2023-09-24 20:46

如何利用socket进行HTTP访问
平常我们要访问某个URL一般都是通过浏览器进行:提交一个URL请求后,浏览器将请求发向目标服务器或者代理服务器,目标服务器或者代理服务器返回我们所需要的数据,浏览器接收到这些数据后保存成文件并进行显示。
下面我们看看如何自己利用winsock2.h中的接口来实现这个功能?为了简化问题,作以下假设:
通过代理服务器进行HTTP访问,这样就省去了对URL进行DNS解析的步骤,假设代理服务器的地址为:192.168.0.1:808。

这个功能由以下几个部分组成:
1. 如何建立连接?
2. 如何发送请求?
3. 如何接收数据?
4. 如何判断数据接收完成?

下面我们依次来看下这些问题如何解决?
一、如何建立与服务器之间的连接
HTTP基本TCP,所以我们需要与服务器建立连接,然后才能发送数据。
建立连接参考如下函数socket_open:
/*
*打开Socket,返回socketId,-1表示失败
*/
int socket_open(int IP,int Port,int type){
SOCKET socketId;
struct sockaddr_in serv_addr;
int status;

socketId=socket(AF_INET,SOCK_STREAM,0);

if((int)socketId<0)
{
printf("[ERROR]Create a socket failed!/n");
return -1;
}

memset(&serv_addr,0,sizeof(serv_addr));
serv_addr.sin_family=AF_INET;
serv_addr.sin_addr.s_addr = ntohl(IP);
serv_addr.sin_port = htons((USHORT)Port);
status=connect(socketId,(struct sockaddr*)&serv_addr,sizeof(serv_addr));
if(status!=0)
{
printf("[ERROR]Connecting failed!/n");
closesocket(socketId);
return -1;
}
return socketId;
}
调用方式如下:
int socketId=socket_open(0xC0A80001,808,0); //0xC0A80001是192.168.0.1的十六进制写法。
二、如何发送请求
发送数据要根据HTTP协议的要求附加协议头:
static const char* protocolHead="GET http://www.xxx.com/index.html HTTP/1.1/n"
"Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*/n"
"Accept-Language: zh-cn/n"
"User-Agent:iPanelBrowser/2.0/n"
"Host: www.xxx.com:80/n"
"Connection: close/n/n"
这里使用GET来获取指定URL的指定文档。
建立连接后使用send将这些数据发送出去:
send(socketId, protocolHead,strlen(protocolHead),0);
发送完成HTTP请求后就等待接收数据。

三、如何接收数据
这里采用select循环查询的方式来判断有无数据到来:

struct timeval tm = {0,7};
fd_set fds_r;
int status;
char recvBuf[4096]={‘/0’};
FD_ZERO(&fds_r);
FD_SET(socketId,&fds_r);

status=select(socketId+ 1, &fds_r, 0, 0, &tm); //socketId在这里是最大的fd

if(status > 0 && FD_ISSET(socketId, &fds_r))
{
printf("Socket is readable...fd=[%d]/n",socketId);
recv(socketId,recvBuf,4096,0);
}

这样数据包就保存到缓冲区中了。

四、如何判断数据接收完成
首先对返回数据的状态进行判断,仅当状态为“ HTTP 200 OK ”时才表明正确返回,这时才对数据进行解析并保存,如果状态为HTTP 404 NOT FOUND或者其它状态则表明没有找到资源或者出现其它问题,可参考HTTP 1.1状态代码及其含义。
当数据正确返回时,为了将实际数据从协议中分离出来进行保存,需要对HTTP数据包进行解析得到Content-Length,然后在包含Content-Length的当前数据包或者随后的数据包中查找第一个空行,这就是内容(Content)的开始位置,再配合前面解析得到的Content-Length,就能够知道什么时候数据接收完成了。换行符为“/r/n”,也兼容“/n”或者“/r”,设换行符为^P,则空行如果位于内容中间或结尾则可查找“^P^P”,若位于开头,则查找^P。

基本就是上面这些,这四个问题解决了,那么整个问题也就解决了!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
干货| 如何利用PPT绘制手绘图像(内含视频教学)。 小米Mix2s开发者选项的设置与应用指南(探索小米Mix2s开发者选项)_百度... 我今年41岁女,我想问一买哪种养老保险更合算,可以一次买吗?要多少... 我们家有营业执照。我现在41岁了。养老保险如何来买?一年,交多少钱? 搅拌桩的两喷两搅怎么理解 ...上关于一喷二搅、二喷二搅、二喷三搅、二喷四搅的具体做法 两搅两喷与四搅四喷的区别 三轴搅拌桩两搅四喷是什么意思 梦幻西游将军令怎么解绑 EXCEL表,求值? 宇宙中的暗物质是否真存在? 怎么提高电脑下载速度 日本为什么是J联赛,而不是甲级/超级联赛﹖ 如果画漫画人物,线条要怎样才能看起来更令人舒服? 最近新闻说美国诬陷中国和一个什么国家有秘密的联... 动漫人物脸上的黑线是什么意思 异星灾变那个塔利小女孩到底是什么 如何使用Socket来模拟HTTP请求与相应 怎么才能让下载速度更快?? 奈非尔塔利存在吗 Http与Socket请求的区别: 这种动漫人物的线条是怎样画出来的呢?,有什么技... 怎样可以提快下载速度 Natalie啥意思 C语言如何利用socket进行HTTP访问 红塔利是种什么木材 linux之socket , URL 访问http服务器 塔利舍牙佛是求什么的大家围着转啥意思啊 如何提高电脑的下载速度? JAVA 使用Socket 访问HTTP服务器 怎样提高下载速度和网络速度 蒙古语塔力根土是什么意思 如何用同一个socket连接,发送多次http请求 呼和浩特塔利村属于什么乡管辖? 怎么让下载速度变快 日本J1联赛目前积分榜 画动漫人物的时候线条粗细有没有讲究 画动漫人物怎么勾线看不到 线条 怎样提高下载速度 C++ 如何使用 Socket 类向 HTTP 服务器发送数据和... PS做动漫人物怎么沟黑色轮廓线条 python socket支持http吗 电脑下载速度怎么调 中国动漫人物线边(就是勾勒出来的黑边)那么重 下载速度怎么调…? 乳酪可分为多少种? 动漫人物怎么排线? 怎么把电脑下载速度提高 画漫画时,那些在人物周围的线条是用来干嘛的? 怎么提高下载速度啊