c语言打开网页文件

C语言打开一个网页,用指定浏览器

ShellExecute 第三个参数指定浏览器的执行文件全名;第四个参数指定网址。例如用IE打开:

ShellExecute(0, “open”, “C:\\Program Files\\Internet Explorer\\iexplore.exe”, “”, NULL, SW_SHOW);

一般浏览器都支持网址参数。如果某浏览器显示默认主页,说明该浏览器不支持网址参数。

如何用C语言打开网站?

参考代码如下:

#include windows.h

int main(void)

{

    ShellExecute(NULL, “open”, “”, NULL, NULL, SW_MINIMIZE);

    return 0;

}

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

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

简单的请求格式

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,重新操作。)

c语言打开网页文件

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;

}

本文来自投稿,不代表【】观点,发布者:【

本文地址: ,如若转载,请注明出处!

举报投诉邮箱:253000106@qq.com

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年3月27日 14:10:10
下一篇 2024年3月27日 14:18:27

相关推荐

  • c语言改写模式,c语言实现修改功能

    c语言程序修改? 1、这个程序有4个错误,我都加粗了,第一个是m没有赋初值,第二个是while表达式中的ch=getchar()需要括号括起来,第三个是m=m*10+ch-0中的0也需要用单引号括起来,第四个是第2个while中为m!=0。 2、define容易造成误会,因为不符合一般的编程习惯,false 0, true 1;scanf放在你的那个地方是达…

    2024年5月23日
    4100
  • c语言控制代码的换码序列,c语言交换代码

    求C语言编程大神解答一下下面这个编程代码? k==5,用5去除125余0,所以r=125%5中r为0。由于!0为1,所以执行while循环体:先打印出5(k的值),再n=n/k==125/5=25;由于251则再打印出*号。这一循环结果输出是5*。 下面是我的代码,三个函数分别对应三个问题。 在实现基本要求的前提下,拓展了可以从键盘输入的功能,以下为各题代码…

    2024年5月23日
    5800
  • linux给文件写权限,linux怎么给文件权限

    linux宝塔写入权限不足 1、可以使用chmod命令修改权限。语法:chmod [-cfvR] [–help] [–version] mode file…说明 : Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用。 2、通过更改文件权限可以使用c…

    2024年5月23日
    5200
  • c语言扫描io脚状态,c语言端口扫描

    求51单片机的上升沿和下降沿C语言检测程序列子,端口就是普通IO口。 上升沿触发是当信号有上升沿时的开关动作,当电位由低变高而触发输出变化的就叫上升沿触发。也就是当测到的信号电位是从低到高也就是上升时就触发,叫做上升沿触发。 单片机怎么计算1s内下降沿的个数的C语言程序或者计算两个下降沿的时间(检测脉冲频率)计算1s内下降沿的个数方法是,一个定时器设置定时1…

    2024年5月23日
    4500
  • c语言mallloc使用的简单介绍

    C语言中使用malloc必须加#includemallo.h? 1、在C语言中使用malloc函数进行动态内存分配。malloc的全称是memory allocation,中文叫动态内存分配。原型:extern void malloc(unsigned int num_bytes);功能:分配长度为num_bytes字节的内存块。 2、你可以看一下C语言那本…

    2024年5月23日
    4500
  • c语言三位小数,C语言三位小数

    怎样用C++语言输出精确到小数点后三位的数? 1、用C++语言输出精确到小数点后三位的数,可以参考下面给出的代码:coutsetiosflags(ios:fixed)setprecision(3)。其中 setiosflags中set是设置的意思。ios是iostream的缩写,即输入输出流。flags是标志的意思。 2、要精确到小数点后若干位,则数据类型为…

    2024年5月23日
    7500
  • c语言21点游戏,二十一点游戏代码c语言

    如何使用C语言编写简单小游戏? 1、数学知识:长方形的面积S=a*b 长方形周长L=2*(a+b)其中a b分别为长方形的宽和高。算法分析:长方形面积及周长均依赖于宽和高,所以先要输入宽高值,然后根据公式计算,输出结果即可。 2、/*也不知道你是什么级别的,我是一个新手,刚接触编程语言,以下是我自己变得一个小程序,在所有c语言的编译器(vc++0、turbo…

    2024年5月23日
    6500
  • c语言当中的null,C语言当中的符号

    C/C++中,NULL和null的区别是什么? nul 和 null要看编译器,不同的编译器有所区别。 所以C或者C++中都使用一个特殊定义NULL表示无效值,其本质就是未定义具体数据类型的0值。 null是是什么都没有的意思。在java中表示空对象。 本意是“空的;元素只有零的”意思。计算机中通常表示空值,无结果,或是空集合。\x0d\x0a在ASCII码…

    2024年5月23日
    4700
  • 包含c语言对txt文件命名的词条

    如何在C语言编程里面修改源文件名字 如果你是在WINDOWS的话,简单了,随便用个编辑器,比如记事本,然后写c源程序,保存到你想要保存的位置。如果你在DOS下,可以用edit,写好以后,按alt键,选择文件菜单,然后保存。 用open打开文件,注意操作模式使用“修改”或者“添加” 用write或者fprintf向文件中写入你的内容。 用close关闭文件。 …

    2024年5月23日
    5000
  • 学c语言编程,学c语言编程用什么软件

    编程开发必须要学C语言吗? 1、要学习。编程开发的学习内容主要包括c语言、python和c+语言。C语言作为一种简单灵活的高级编程语言,它是一个面向过程的语言,一般是作为计算机专业的基础入门语言课程。 2、C语言。对于刚接触编程的人来说,先学习C语言是非常重要的。C语言可以说是是计算机编程语言的鼻祖,其他的编程语言几乎全是由C语言变化衍生出来的。 3、不需要…

    2024年5月23日
    3500

发表回复

登录后才能评论



关注微信