c语言打开网页文件

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

ShellExecute(0," open "," C:\ \ Program Files \ \ Internet Explorer \ \ ie xplore . exe ","",NULL,SW _ SHOW);

一般浏览器都支持URL参数。如果浏览器显示默认主页,则意味着浏览器不支持URL参数。

如何用C语言开一个网站? 参考代码如下:

#包含windows.h

int main(void)

{

ShellExecute(NULL," open ","",NULL,NULL,SW _ MINIMIZE);

返回0;

}

在示例中,它被最小化,也可以被最大化SW_MAXIMIZE、hidden SW _ HIDE等。

如何通过C语言读取网页中的数据 简单请求格式

GET /index.php HTTP/1.0

主持人:

当我们与服务器连接时,发送上述数据,服务器将为我们返回index.php页面。

得到这个意味着如何请求。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协议的版本,它是固定的。

第二行主机:用于指定要访问哪个主机。我们都知道,一个服务器可以托管很多网站,每个网站都有不同的域名,所以我们需要用这个主机来指定我们要访问哪个网站,从而正确访问我们要访问的网站。

第一步是连接到服务器。

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

是的,就这么简单。

在写程序之前,我们先用一个小工具模拟一下这个过程,这样可以对http协议有更多的了解。

Telnet工具如果win7下的朋友戳这里——Win 7开启telnet功能。

至此,我假设每个人的电脑上都开启了telnet功能,话题开始。

Telnet是一个基于tcp/ip协议的程序,它为我们的用户提供了一个与其他计算机进行通信的工具,我们可以用它来与其他计算机进行通信。

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

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

然后我们就进入open 80,进入。

Open表示打开,后面是要打开的主机,然后是端口。web服务器默认使用端口80,所以需要添加端口80 (telnet默认为端口23,没有端口)。

然后就会出现如下图所示的情况。这时候我们就可以输入命令了,所有输入的命令都会发送到自学论坛服务器上。注意下图红色箭头指示的部分,有输入光标的地方,不考虑其他单词。

这意味着我们已经连接到远程主机,这意味着我们需要在客户端执行上一课中的connect函数后调用send函数来发送数据。在这里,我们只需要按下键盘,将其输入到黑色窗口,并发送到服务器。

下面我们依次输入以下内容。(注意,不能按退格键。如果出错,只需重新打开telnet并再次操作即可。)

如何在Linux下打开C语言的网页 给你一个,我自己调试的,加了详细的注释~ ~记得给分,我没单独提问~

#包含stdlib.h

#包含stdio.h

#包括unistd.h

#包含fcntl.h

#包含sys/types.h

#包含sys/socket.h

#包含netinet/in.h

#包含错误号h

#包含时间. h

#包含sys/types.h

#包含sys/ioctl.h

#包含字符串. h

#包含stdarg.h

#包含netdb.h

#include setjmp.h

#包含信号. h

/*超时后返回gethostbyname。

这里使用的方法是设置一个时钟。如果gethostbyname在指定时间内没有返回,

时钟会强制它返回,返回的值明显是一个空指针,相当于告诉用户主机没有联网或者域名无法解析。*/

静态sigjmp _ buf jmpbuf

Static void alarm_func() //这个函数执行后,会执行一个跳转。

{

siglongjmp(jmpbuf,1);

}

静态结构hostent * gngethostbyname(char * HostName,int timeout)

{

struct hostent * lpHostEnt

信号(SIGALRM,alarm _ func);//接受报警信号,调用函数。

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

{

报警(0);//timout

信号(SIGALRM,SIG _ IGN);

返回NULL

}

报警(超时);//设置报警

printf(" \ n将获取主机!\ n ");

lpHostEnt = gethostbyname(主机名);

信号(SIGALRM,SIG _ IGN);

返回lpHostEnt

}

/*(Linux Socket编程实现连接超时的一种方法。

创建一个套接字,并将其设置为非阻塞状态。

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

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

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

{

//最好检查参数,要求传入3个参数URL端口超时(Connect Send Recv的3个参数超时)。

int fd,retval,res,error

struct sockaddr _ in addr

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

struct hostent *网站;

socklen _ t len = sizeof(timeo);

fd_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(" \ n找不到该网站!\ n ");

return-2;

}

fcntl(fd,F_SETFL,fcntl(fd,F _ GETFL)| O _ non block);//设置为非阻塞模式

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(" connected 1 \ n ");

//返回0;

}*/

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

//printf(" \ n连接结果:[%d]\n ",RES);

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

{

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

如果(errno!= EINPROGRESS) {

printf("connect:正常网络unreach!!");

return-1;

}

printf(" \ n将选择\ n ");

FD_ZERO(设置);/*清除集合,使集合不包含任何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(" time out \ n ");//这样的选择相当于在超时内成为阻塞模式,超时后直接返回。

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

返回0;

}

其他

{

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

getsockopt(fd,SOL_SOCKET,SO_ERROR,ERROR,(socklen _ t *)len);//判断连接成功后,获取一些windows sockets的当前信息来判断是否真的连接,返回0表示真的连接。

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

如果(0!=错误)

return-1;

}

}

int ul = 0;

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

//返回0;

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

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

printf(" \ n before \ n ");

睡眠(5);//在sleep 5中,拔掉网线就可以测试recv的超时功能。如果不添加recv的超时功能,拔下网线后会一直卡在那里。当然,实际应用中不需要添加这个。

printf(" \ n过滤器\ n ");

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

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

{

printf("发送消息时出错\ n ");

出口(1);

}

int I = 0;

char buf[1000];

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

{

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

我;

}

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

关闭(FD);

返回;

}

相关文章

发表新评论