c语言 dll http client,用C语言实现一个简单的HTTP Client(HTTP客户端)

2023-05-16

用C语言实现一个简单的HTTP Client(HTTP客户端)

作者:gobitan(雨水) 日期:2007-04-03 转载请注明出处 http://blog.csdn.net/gobitan

HTTP协议是一个基于文本的协议,因此用C语言实现一个简易的HTTP客户端就不是什么难事。但如果对这个不熟悉,要想一下子实现一个HTTP GET方法取获取一个网页这么简单的功能恐怕也未必是两三分钟能搞定的事。其关键是要理解HTTP协议的工作原理,具体参见RFC2616规范(http://www.ietf.org/rfc/rfc2616.txt);

本文仅仅用一二十行代码就实现了一个简单的HTTP客户端,它能够将163的首页获取并打印出来。

全部源代码如下(httpClient.c),注意下面的程序是经过精简的,很多参数直接写入了程序,仅仅作为演示用。其中baidu服务器地址是通过ping  www.baidu.com  获取到的,可能有变,测试时请灵活一点。

只需修改“strcat(sndBuf, "Host:  www.baidu.com\r\n\r\n ");”和“ inet_addr("

202.108.22.5");”就可以获取其他地址的页面。

#include

#include "winsock2.h"

#pragma comment(lib, "ws2_32.lib")

int main()

{

SOCKET      sSocket      = INVALID_SOCKET;

SOCKADDR_IN stSvrAddrIn = {0}; /* 服务器端地址 */

char        sndBuf[1024] = {0};

char        rcvBuf[2048] = {0};

char       *pRcv         = rcvBuf;

int         num          = 0;

int         nRet         = SOCKET_ERROR;

WSADATA     wsaData;

/* HTTP 消息构造开始,这是程序的关键之处 */

sprintf_s(sndBuf, 1024,"GET / HTTP/1.1\n");

strcat_s(sndBuf,1024, "Host: www.baidu.com\r\n\r\n");

/* HTTP 消息构造结束 */

/* socket DLL初始化 */

WSAStartup(MAKEWORD(2, 0), &wsaData);

stSvrAddrIn.sin_family      = AF_INET;

stSvrAddrIn.sin_port        = htons(80);

stSvrAddrIn.sin_addr.s_addr = inet_addr("202.108.22.5");

sSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

/* 连接 */

nRet = connect(sSocket, (SOCKADDR*)&stSvrAddrIn, sizeof(SOCKADDR));

if (SOCKET_ERROR == nRet)

{

printf("connect fail!/n");

return -1;

}

/* 发送HTTP请求消息 */

send(sSocket, (char*)sndBuf, sizeof(sndBuf), 0);

/* 接收HTTP响应消息 */

while(1)

{

num = recv(sSocket, pRcv, 2048, 0);

pRcv += num;

if((0 == num) || (-1 == num))

{

break ;

}

}

/* 打印响应消息 */

printf("%s/n", rcvBuf);

return 0;

}

本程序的最为关键是构建HTTP GET消息。HTTP协议规范4.1小节中描述了HTTP消息的格式,它包括一个起始行,零个或多个消息头,然后是空行(CRLF),最后是可选消息体。演示程序中构建的HTTP消息包含一个请求行(GET / HTTP/1.1)和一个消息头(Host: www.baidu.com)。如下两行代码:

sprintf(sndBuf, "GET / HTTP/1.1\n");

strcat(sndBuf, "Host: www.baidu.com\r\n\r\n");

GET是HTTP的获取方法,随后的’/’表示获取根目录下的默认页面,”HTTP/1.1”标明了协议及版本,注意后面的”\n”是必不可少的。

下面一行是消息头,指明了获取的主机,注意后面的”/n/r/n”,这个一定不能错。空行CRLF就是用”\r\n”表示,这一点耗费了我很多时间,希望写出来对大家有帮助。

本程序在Visual Stdio 2012环境下编译通过并运行。直接执行程序,将打印出如下所示的获取结果:

HTTP/1.1 200 OK

Date: Tue, 27 May 2014 15:54:51 GMT

Content-Type: text/html; charset=utf-8

Transfer-Encoding: chunked

Connection: Keep-Alive

Vary: Accept-Encoding

Set-Cookie: BAIDUID=96334C3635D08A3946EB82E3A6902B89:FG=1; expires=Thu, 31-Dec-3

7 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com

Set-Cookie: BDSVRTM=0; path=/

Set-Cookie: H_PS_PSSID=6621_6740_5228_1428_5225_6582_6506_4759_6017_6673_6442_67

73_6530_6449; path=/; domain=.baidu.com

P3P: CP=" OTI DSP COR IVA OUR IND COM "

Cache-Control: private

Expires: Tue, 27 May 2014 15:54:43 GMT

X-Powered-By: HPHP

Server: BWS/1.1

BDPAGETYPE: 1

BDQID: 0xbd3ac1d800046cc5

BDUSERID: 0

3c7d

nt="text/html;charset=utf-8">

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

c语言 dll http client,用C语言实现一个简单的HTTP Client(HTTP客户端) 的相关文章

随机推荐