Winapi 我的Windows Socket程序无法打开FireFox、IE等浏览器可以打开的某些URL

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服务器接收的,保存在硬盘上。该文件稍后在

我制作了以下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); } }
注意:请将头文件名括在尖括号中的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);