189 8069 5689

c语言有访问网页的函数吗 C语言直接访问

怎么通过C语言读取网页里面的数据

简单的请求格式

创新互联公司于2013年开始,是专业互联网技术服务公司,拥有项目成都网站设计、成都做网站、外贸网站建设网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元东台做网站,已为上家服务,为东台各地企业和个人服务,联系电话:028-86922220

GET /index.php HTTP/1.0

host:

当我们和服务器连接上之后,发送上面的数据过去,服务器就会返回 index.php 这个页面给我们。

GET 这个 是表示 以什么方式请求,HTTP中还有很多其他的请求方式,常用的就 GET POST (更详细的 可以点开上面 http协议 那个链接)

GET 后面紧跟一个空格 然后 给出,要获取的资源的名称, /index.php 就表示获取网站服务器根目录下 index.php 执行后所产生的内容,我们也可以改成 GET / HTTP/1.0 这就表示获取默认首页的内容 。 GET /1.html HTTP/1.0 就是获取 服务器根目录下 1.html的内容,很容易理解吧。

接下来隔一个空格 跟上 HTTP/1.0 表示 http协议的版本,这个是固定的 。

第二行 host: 用来指定 访问哪个主机。 大家都知道,一个服务器可以放很多个网站,每个网站有不同的域名,所以我们需要用这个host来指定 我们要访问的是哪个网站,这样 才能正确得访问到我们想访问的网站。

第一步,连接服务器。

第二步,按照http协议,发送请求数据,然后就是接受返回的内容。

没错,就这么简单。

在编写程序之前,我们先用一个小工具来模拟一下这个过程,好让我们对http协议了解更深入一些。

telnet工具 如果是 win7下的朋友 猛戳这里--win7开启telnet功能

到此为止,我假设大家电脑上已经开启了 telnet功能,正题开始。

telnet 他是一个基于tcp/ip 协议的程序,为我们用户提供一个 与其他电脑通信的工具,我们可以使用他来和其他电脑进行连接通信。

开始-运行-输入telnet回车, 出现一个黑框如下。

我们这时就可以输入命令,来连接远程主机,比如我们这次是要连接我们自学去论坛 的服务器,

那么我们就输入 open 80 然后回车。

open 是打开的意思 后面跟上 要打开那个主机 然后 后面跟上端口, web服务器默认使用的是80端口,所以 要加上80端口(不加端口 telnet默认是23端口)。

然后会出现下图的情况,这时候 我们就可以输入命令了,输入的命令都将被发送到自学去论坛的服务器上面。大家注意一下 下图红色箭头所指出的部分,那里就是一个输入光标,不用管其他的字。

这就代表 我们已经和远程主机连接上了,就相当于我们上节课中 客户端执行到 connect 函数 之后 就是要调用 send函数发送数据了,在这里 我们只需要按键盘输入到黑色窗口中 就会发送到服务端。

我们依次输入以下内容,(注意,不能按退格,输入错误了,就重新打开telnet,重新操作。)

Linux中怎么用C语言打开网页

给你一个哈,我自己调试好的,并且加了详细注释~~记得给分啊,我没分问问题了~

#include stdlib.h

#include stdio.h

#include unistd.h

#include fcntl.h

#include sys/types.h

#include sys/socket.h

#include netinet/in.h

#include errno.h

#include time.h

#include sys/types.h

#include sys/ioctl.h

#include string.h

#include stdarg.h

#include netdb.h

#include setjmp.h

#include signal.h

/*gethostbyname 超时返回

这里使用的办法是设置一个时钟,如果gethostbyname在指定的时间内尚未返回,

时钟会强制其返回,得到的返回值显然是空指针,等价于告诉用户主机未连如互联网或者该域名无法解析。*/

static sigjmp_buf jmpbuf;

static void alarm_func() //该函数执行之后会执行跳转

{

siglongjmp(jmpbuf, 1);

}

static struct hostent *gngethostbyname(char *HostName, int timeout)

{

struct hostent *lpHostEnt;

signal(SIGALRM, alarm_func); //接受alarm信号,然后调用函数

if(sigsetjmp(jmpbuf, 1) != 0)//跳转目的地

{

alarm(0);//timout

signal(SIGALRM, SIG_IGN);

return NULL;

}

alarm(timeout);//setting alarm

printf("\nwill gethost!\n");

lpHostEnt = gethostbyname(HostName);

signal(SIGALRM, SIG_IGN);

return lpHostEnt;

}

/*(linux socket编程实现connect超时的一种方法

创建套接字,将其设置成非阻塞状态。

调用connect连接对端主机,如果失败,判断当时的errno是否为EINPROGRESS,也就是说是不是连接正在进行中,如果是,转到步骤3,如果不是,返回错误。

用select在指定的超时时间内监听套接字的写就绪事件,如果select有监听到,证明连接成功,否则连接失败。*/

int main(int argc, char *argv[])

{

//最好检查一下参数,要求传入3个参数 URL PORT TIMEOUT(connect send recv 3个参数的超时)

int fd, retval,res,error;

struct sockaddr_in addr;

struct timeval timeo = {15, 0}; //time ou struct

struct hostent *site;

socklen_t len = sizeof(timeo);

fd_set set;

fd = socket(AF_INET, SOCK_STREAM, 0);

if (argc == 4)

timeo.tv_sec = atoi(argv[3]);

site=gngethostbyname(argv[1],3); //解析域名的超时设置,测试域名超时,可以写一个可以ping的通但是没有办法解析域名

//的IP地址到resolv.conf里面,然后加上一个默认路由,直接PING一个百度,就能发现如果不加超时机制就会一直卡在那里

if(NULL == site)

{

printf("\ncan not find the site!\n");

return -2;

}

fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK); //设置为非阻塞模式

addr.sin_family = AF_INET;

//addr.sin_addr.s_addr = inet_addr(argv[1]);

memcpy(addr.sin_addr, site-h_addr_list[0], site-h_length);

addr.sin_port = htons(atoi(argv[2]));

printf("%d\n", time(NULL));

/*if (connect(fd, (struct sockaddr*)addr, sizeof(addr)) == 0) {

printf("connected1\n");

// return 0;

}*/

//res=connect(fd, (struct sockaddr*)addr, sizeof(addr));

//printf("\nconnect result:[%d]\n",res);

if (connect(fd, (struct sockaddr*)addr, sizeof(addr)) != 0)

{

//调用一次系统函数失败后直接看errno,确定是什么问题,下面的代码可以实现在没有默认路由的情况下直接返回失败.

if (errno != EINPROGRESS) {

printf("connect:normal network unreach!!");

return -1;

}

printf("\nwill select\n");

FD_ZERO(set);/*将set清零使集合中不含任何fd*/

FD_SET(fd,set); /*将一个给定的文件描述符加入集合之中*/

retval = select(fd + 1, NULL, set, NULL, timeo);

if (retval == -1) {

printf("select");

return -1;

} else if(retval == 0) {

printf("timeout\n"); //这样的select等于是变成了再timeout时间内是阻塞模式,超过timeout就直接返回

printf("%d\n", time(NULL));

return 0;

}

else

{

printf("connected---:[%d]\n",retval);

getsockopt(fd, SOL_SOCKET, SO_ERROR, error, (socklen_t *)len); //判断在connected成功之后,获取套接口目前的一些信息来判断是否真的是连接上了,返回0表示真的连上了

printf("error---:[%d]\n",error);

if(0!=error)

return -1;

}

}

int ul = 0;

ioctl(fd, FIONBIO, ul); //设置为阻塞模式

//return 0;

setsockopt(fd,SOL_SOCKET,SO_SNDTIMEO,(char *)timeo,sizeof(timeo));

setsockopt(fd,SOL_SOCKET,SO_RCVTIMEO,(char *)timeo,sizeof(timeo));

printf("\nbefore\n");

sleep(5); //在sleep 5的时候,拔掉网线就可以测试出recv超时的功能,如果不加recv 的超时功能,拔掉网线后就会一直卡在那里,当然你在实际应用的时候没必要加这个

printf("\nafter\n");

char *msg="GET / HTTP/1.0\r\n\r\n";

if( send(fd, msg, strlen(msg), 0)0 )

{

printf("error in send msg\n");

exit(1);

}

int i=0;

char buf[1000];

while((recv(fd,buf,1000,MSG_WAITALL))0)

{

printf("[%d]:[%s]",i,buf);

i++;

}

printf("\n------end---------\n");

close(fd);

return;

}

如何用C语言打开网站?

参考代码如下:

#include windows.h

int main(void)

{

ShellExecute(NULL, "open", "", NULL, NULL, SW_MINIMIZE);

return 0;

}

例子中是最小化打开的,还可以是最大化SW_MAXIMIZE,隐藏SW_HIDE等。


分享文章:c语言有访问网页的函数吗 C语言直接访问
链接地址:http://cdxtjz.com/article/hijdic.html

其他资讯