【发布时间】:2011-12-25 12:16:15
【问题描述】:
我做了以下win32 socket程序来浏览网页。我正在使用wingw 来避免对任何运行时的依赖。要获取 ipaddresses,我通过命令提示符 ping 诸如 www.google.com、www.yahoo.com 之类的 url,并在我的程序中使用这些 ip 地址。端口当然是 80。
我可以通过使用“GET /\r\n”来获取 google、yahoo 等的默认页面。我还可以使用“GET /newsite/index.aspx”获取非默认页面,甚至是目录内的页面,例如http://yasini.com/newsite/index.aspx。程序的输出是从 webserver 接收到的 html 格式,保存在硬盘上。该文件稍后在 Firefox 中打开,以查看通信进展如何。
我做了一个测试网页,http://a.domaindlx.com/trysite/hello.asp,我可以在 Firefox 中打开。然后我 ping 域 a.domaindlx.com 并获取这个 IP 地址 66.36.238.30。我尝试使用“GET /trysite/hello.asp”访问上述页面,但得到的回应是,“此地址未配置网站。此地址未配置网站。”
我知道上述响应是由网络服务器发送的,所以我能够连接到网络服务器。问题是网络服务器无法识别我尝试访问的 url。我用过不同的网页,htm 和 asp 都不能访问。
当尝试直接在浏览器中使用 ipaddress 打开网站时,我得到同样的错误,“没有配置网站...”。
基本的谜团是,为什么这些页面可以通过 Firefox 等浏览器访问,但不能通过我的代码访问,当我的代码本质上是一个浏览器时,意味着在端口 80 上与网络服务器打开连接。
#包括windows.h #include stdio.h WSADATA ws; 诠释d; 字符 aa[1000]; 结构 sockaddr_in a; 套接字; 诠释李; 无效 abc(char *p) { 文件 *fp = fopen("c:\\data.htm", "a+"); fprintf(fp, "%s\n", p); fclose(fp); } _stdcall WinMain (HINSTANCE i, HINSTANCE j, char * k, int l) { d = WSAStartup(0x101, &ws); sprintf(aa, "WSASTARTUP = %d", d); abc(aa); s = 套接字(AF_INET,SOCK_STREAM,0); sprintf(aa, "SOCKET = %d", s); abc(aa); a.sin_family = AF_INET; a.sin_port = htons(80); //a.sin_addr.s_addr = inet_addr("74.125.236.145"); a.sin_addr.s_addr = inet_addr("66.36.238.30"); //a.domaindlx.com //a.sin_addr.s_addr = inet_addr("206.225.85.18"); //www.domaindlx.com //a.sin_addr.s_addr = inet_addr("87.248.122.122"); //www.yahoo.com //a.sin_addr.s_addr = inet_addr("72.167.153.9"); //www.yasini.com d = connect(s, (struct sockaddr *) &a, sizeof(a)); strcpy(aa, "GET /trysite/hello.asp\r\n"); strcat(aa, "HTTP 1.0 \r\n\r\n"); 发送(s,aa,sizeof(aa),0); 李 = 1; 而(李!= 0) { li = recv(s, aa, 1000, 0); abc(aa); } }注意:请将包含行中的头文件名括在尖括号中,以使代码正常工作。我必须删除它以属性格式化 html。
【问题讨论】:
-
为什么不省去很多麻烦并使用出色的 libcurl 库呢?便携、坚固且免费。