備注學院

          LuLu

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            5 隨筆 :: 50 文章 :: 16 評論 :: 0 Trackbacks

          #include <stdio.h>
          #include <stdlib.h>
          #include <string.h>
          #include <winsock2.h> //header
          #pragma comment (lib, "ws2_32.lib") //lib

          void SendString(SOCKET sock,LPCSTR str)
          {
              send(sock,str,strlen(str),0);
          }

          int main(void)
          {
           WSADATA  wsaData;
           SOCKET  sock;
           SOCKADDR_IN tcpaddr;
           hostent * remoteHost;
           char   host[] = {"www.hao123.com"};     //主機名就直接寫了
           int   Ret,l;
           BOOL  done;
           int   port = 80;
           int   chars = 0;
           char  buffer[512];

           if( (Ret = WSAStartup(MAKEWORD(1,1), &wsaData) ) != 0 )
           {
            printf("WSAStartup failed with error %d\n", Ret);
            return 1;
           }

           if( (remoteHost = gethostbyname(host)) == NULL )       //通過主機名獲取地址
           {
            printf("gethostbyname error!\n");
            return 1;
           }
           
           sock = socket (AF_INET, SOCK_STREAM, 0);
           
           tcpaddr.sin_family = AF_INET;
           tcpaddr.sin_port = htons( (unsigned short)port );
           tcpaddr.sin_addr.s_addr = *((unsigned long *)*remoteHost->h_addr_list);  //轉換地址

           if( connect(sock, (const sockaddr * )&tcpaddr, sizeof(tcpaddr)) )
           {
            printf("connect error!");
            return 1;
           }
          //這里是要發送的http頭部
           SendString(sock,"GET / HTTP/1.1\r\n");
           SendString(sock,"Host:www.hao123.com\r\n");
           SendString(sock,"Accept: */*\r\n");
           SendString(sock,"User-Agent: Mozilla/4.0");
           SendString(sock,"(compatible; MSIE 5.00; Windows 98)\r\n");
           SendString(sock,"Connection:Keep-Alive\r\n");
           SendString(sock,"\r\n");
           SendString(sock,"\r\n");//最后要加空行

           done = FALSE;
           FILE * fp;
           fp = fopen("1.txt","w");
          //打印并保存http響應的頭部
              while(!done)
              {
                  l = recv(sock,buffer,1,0);
                  if(l<0)
                      done=TRUE;
            switch(*buffer)
                  {
                      case '\r':
                          break;
                      case '\n':
                          if(chars==0)
                              done = TRUE;
                          chars=0;
                          break;
                      default:
                          chars++;
                          break;
                  }
            printf("%c",*buffer);
            fputc(buffer[0],fp);
              }

          //接收正文部分
           int sum = 0;
           do
           {
            l = recv(sock,buffer,sizeof(buffer)-1,0);
            if( l < 0 )
             break;
            sum += l;
            *(buffer + l) = 0;
            fputs(buffer,fp);
           } while( l > 0 );

           //這里輸出正文部分大小,發現其實和響應消息頭部的Content-length大小是一樣的
          //這樣就可以檢查是否接受完畢
           printf("sum = %d\n",sum);

           closesocket(sock);

           if( WSACleanup() == SOCKET_ERROR )
           {
            printf("WSACleanup failed with error %d \n", WSAGetLastError() );
           }

           return 0;
          }

           

           


           

          posted on 2007-11-17 10:35 smildlzj 閱讀(588) 評論(0)  編輯  收藏 所屬分類: C&C++
          主站蜘蛛池模板: 阜阳市| 双辽市| 桃江县| 九龙坡区| 藁城市| 蒙城县| 夏邑县| 临高县| 承德市| 晋城| 峨山| 聂拉木县| 溆浦县| 耒阳市| 法库县| 禄丰县| 内乡县| 宁河县| 合作市| 阆中市| 车险| 沂源县| 浑源县| 花垣县| 和静县| 北票市| 宣城市| 乡城县| 贺兰县| 梨树县| 绍兴市| 德清县| 龙南县| 屏山县| 蕉岭县| 厦门市| 明光市| 绥德县| 普格县| 怀化市| 呼伦贝尔市|