備注學院

          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++
          主站蜘蛛池模板: 长春市| 修文县| 怀安县| 贺州市| 林西县| 赣州市| 南昌县| 绿春县| 龙海市| 广水市| 深水埗区| 潮州市| 马尔康县| 孟连| 灌南县| 井冈山市| 南康市| 平陆县| 禄丰县| 马龙县| 连州市| 监利县| 宁陵县| 荆州市| 兴化市| 金秀| 平果县| 桦川县| 青海省| 车致| 余江县| 江达县| 怀仁县| 贵州省| SHOW| 海兴县| 常州市| 平阴县| 张家界市| 盐源县| 三都|