備注學院

          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 閱讀(592) 評論(0)  編輯  收藏 所屬分類: C&C++
          主站蜘蛛池模板: 冀州市| 田林县| 正安县| 临邑县| 甘肃省| 苍南县| 南丹县| 伽师县| 峨山| 高雄市| 南和县| 黔南| 白银市| 额尔古纳市| 铁岭县| 广灵县| 台湾省| 城口县| 瑞金市| 碌曲县| 乐陵市| 高邑县| 仙桃市| 镇坪县| 胶南市| 宁夏| 罗定市| 岢岚县| 公安县| 新龙县| 霍林郭勒市| 炉霍县| 大厂| 依安县| 聊城市| 德兴市| 兰考县| 齐河县| 依兰县| 朝阳区| 洛隆县|