Winapi 我的Windows Socket程序无法打开FireFox、IE等浏览器可以打开的某些URL
我制作了以下win32 socket程序来浏览网页。我使用wingw来避免对任何运行时的依赖。要获取ip地址,我通过命令提示符ping URL,如www.google.com、www.yahoo.com,并在程序中使用这些ip地址。港口当然是80号 我可以使用“get/\r\n”获取google、yahoo等的默认页面。我还可以获取非默认页面,甚至是目录中的页面,比如使用“get/newsite/index.aspx”。程序的输出是以html的形式从Web服务器接收的,保存在硬盘上。该文件稍后在firefox中打开,以查看通信进展如何 我制作了一个测试网页,可以在firefox中打开。然后我ping了域名a.domaindlx.com,得到了这个IP地址66.36.238.30。我尝试使用“GET/trysite/hello.asp”访问上述页面,但得到的响应是:“此地址未配置任何网站。此地址未配置任何网站。” 我知道上述响应是由Web服务器发送的,因此我能够连接到Web服务器。问题是Web服务器无法识别我试图访问的url。我使用过不同的网页,htm和asp,没有一个是可访问的 当我试图在浏览器中直接使用ipaddress打开网站时,我得到了相同的错误,“没有配置网站…” 基本的难题是,为什么这些页面可以通过firefox等浏览器访问,而不能通过我的代码访问,而我的代码本质上是一个浏览器,这意味着在端口80打开与webserver的连接 #include windows.h #include stdio.h WSADATA ws; int d; char aa[1000]; struct sockaddr_in a; SOCKET s; int li; void abc(char *p) { FILE *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 = socket(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"); send(s, aa, sizeof(aa), 0); li = 1; while(li != 0) { li = recv(s, aa, 1000, 0); abc(aa); } } #包括windows.h #包括stdio.h WSADATA ws; int d; char-aa[1000]; a中的结构sockaddr_; 插座; 国际李; 无效abc(字符*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,“套接字=%d”,s); abc(aa); a、 sin_family=AF_INET; a、 sin_端口=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=连接(s,(结构sockaddr*)和a,大小(a)); strcpy(aa,“GET/trysite/hello.asp\r\n”); strcat(aa,“HTTP 1.0\r\n\r\n”); 发送(s,aa,sizeof(aa),0); li=1; while(li!=0) { li=recv(s,aa,1000,0); abc(aa); } }Winapi 我的Windows Socket程序无法打开FireFox、IE等浏览器可以打开的某些URL,winapi,api,sockets,Winapi,Api,Sockets,我制作了以下win32 socket程序来浏览网页。我使用wingw来避免对任何运行时的依赖。要获取ip地址,我通过命令提示符ping URL,如www.google.com、www.yahoo.com,并在程序中使用这些ip地址。港口当然是80号 我可以使用“get/\r\n”获取google、yahoo等的默认页面。我还可以获取非默认页面,甚至是目录中的页面,比如使用“get/newsite/index.aspx”。程序的输出是以html的形式从Web服务器接收的,保存在硬盘上。该文件稍后在
注意:请将头文件名括在尖括号中的include行中,以便代码正常工作。我必须删除该属性以格式化html。您没有正确遵守协议。您需要
GET/trysite/hello.asp HTTP/1.0\r\n\r\n
查看完整规范。麻烦的URL正在子域上运行。成功的URL不是。许多Web服务器在同一物理IP上拥有多个帐户,因此它们需要知道请求的是哪个特定域/子域,以便访问正确的帐户。您需要在请求中包含主机
头
还要注意,当您调用send()
发送请求时,您发送的是aa
缓冲区的整个1000字节,这是错误的。您只需发送您实际填写的内容
最后,您通常没有很好地管理套接字。您需要更好的错误处理
试试这个:
#include <windows.h>
#include <stdio.h>
void abc(char *p, int l = -1)
{
FILE *fp = fopen("c:\\data.htm", "a+");
if (fp)
{
if (l == -1) l = strlen(p);
fwrite(p, 1, l, fp);
fclose(fp);
}
}
int WINAPI WinMain (HINSTANCE i, HINSTANCE j, char * k, int l)
{
char aa[1000];
WSADATA ws;
int d = WSAStartup(0x101, &ws);
sprintf(aa, "WSASTARTUP = %d\n", d);
abc(aa);
if (d == 0)
{
SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
sprintf(aa, "SOCKET = %d\n", s);
abc(aa);
if (s != INVALID_SOCKET)
{
char *host = "a.domaindlx.com";
char *file = "/trysite/hello.asp";
struct sockaddr_in a;
memset(&a, 0, sizeof(a));
a.sin_family = AF_INET;
a.sin_port = htons(80);
struct hostent *h = gethostbyname(host);
if (!h)
{
sprintf(aa, "gethostbyname(\"%s\") FAILED\n", host);
abc(aa);
}
else
{
sprintf(aa, "gethostbyname(\"%s\") TYPE = %d\n", host, h->h_addrtype);
abc(aa);
if (h->h_addrtype == AF_INET)
{
a.sin_addr = * (struct in_addr*) h->h_addr;
sprintf(aa, "gethostbyname(\"%s\") IP = %s\n", host, inet_ntoa(a.sin_addr));
abc(aa);
d = connect(s, (struct sockaddr *) &a, sizeof(a));
sprintf(aa, "CONNECT = %d\n", d);
abc(aa);
if (d == 0)
{
sprintf(aa,
"GET %s HTTP/1.0\r\n"
"Host: %s\r\n"
"Connection: close\r\n"
"\r\n",
file, host);
char *p = aa;
int t = strlen(aa);
int li;
do
{
li = send(s, p, t, 0);
if (li < 1)
break;
p += li;
t -= li;
}
while (t > 0);
if (t != 0)
{
abc("SEND FAILED\n");
}
else
{
abc("SEND OK\n");
do
{
li = recv(s, aa, sizeof(aa), 0);
if (li < 1)
break;
abc(aa, li);
}
while (true);
}
}
}
}
closesocket(s);
}
WSACleanup();
}
return 0;
}
#包括
#包括
无效abc(字符*p,整数l=-1)
{
文件*fp=fopen(“c:\\data.htm”,“a+”;
if(fp)
{
如果(l==-1)l=strlen(p);
fwrite(p,1,l,fp);
fclose(fp);
}
}
int WINAPI WinMain(HINSTANCE i、HINSTANCE j、char*k、int l)
{
char-aa[1000];
WSADATA ws;
int d=WSAStartup(0x101,&ws);
sprintf(aa,“WSASTARTUP=%d\n”,d);
abc(aa);
如果(d==0)
{
sockets=SOCKET(AF\u INET,SOCK\u STREAM,0);
sprintf(aa,“套接字=%d\n”,s);
abc(aa);
如果(s!=无效的\u插槽)
{
char*host=“a.domaindlx.com”;
char*file=“/trysite/hello.asp”;
a中的结构sockaddr_;
memset(&a,0,sizeof(a));
a、 sin_family=AF_INET;
a、 sin_端口=htons(80);
结构hostent*h=gethostbyname(主机);
如果(!h)
{
sprintf(aa,“gethostbyname(\“%s\”)失败\n”,主机);
abc(aa);
}
其他的
{
sprintf(aa,“gethostbyname(\%s\”)类型=%d\n”,主机,h->h\U addrtype);
abc(aa);
如果(h->h\u addrtype==AF\u INET)
{
a、 sin_addr=*(struct in_addr*)h->h_addr;
sprintf(aa,“gethostbyname(\%s\”)IP=%s\n”,主机,inet\u ntoa(a.sinu addr));
abc(aa);
d=连接(s,(结构sockaddr*)和a,大小(a));
sprintf(aa,“CONNECT=%d\n”,d);
abc(aa);
如果(d==0)
{
sprintf(aa,
“获取%s HTTP/1.0\r\n”
“主机:%s\r\n”
“连接:关闭\r\n”
“\r\n”,
文件(主机);
char*p=aa;
int t=strlen(aa);
国际李;
做
{
li=发送(s,p,t,0);