用WinSock实现HTTP的GET

原创 2007年10月06日 15:53:00

以前用WinInet的类写过网络爬虫,所以也想自己试着直接用socket来写一个类似程序,看了很多的例程以及文章,自己用WinSock写了一个http下get功能的程序,比较精简,基本体现了这类程序的框架,发现重点还是要了解好http协议的头部,准备进一步学习RFC文档,网上对于http协议的介绍都貌似比较简略。
--2007--10--6--by wangben--hit--

程序是vc下的一个Windows console的工程:

#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;

学用VC++进行Winsock编程──Client端

//////////////////////// 本文来源于网上,出处不详!///////////////////////////////////  说到Winsock,可能很多人还不太了解,但说到O...
  • axes
  • axes
  • 2005年03月11日 00:51
  • 4098

Winsock I/O 模型详解

Winsock共有五种类型的套接字I/O模型,可让Winsock应用程序对I/O进行管理,它们包括: select(选择)、WSAAsyncSelect(异步选择)、WSAEventSelect(事件...
  • windows_nt
  • windows_nt
  • 2014年09月21日 21:31
  • 3315

不能随便输入的“netsh winsock reset”

写这篇文章是因为我在cmd输入了题目中这段命令,结果问题越解决越麻烦。至于为什么输这段指令也是一个悲伤的故事,不再多说。 netsh winsock reset 这个命令作用是重置...
  • q290994
  • q290994
  • 2017年07月16日 21:20
  • 17491

winsock 错误多的真爽啊

Windows平台下用C++做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h先于winsock2.h)就会出现很多莫名其妙的错误。诸如: c:\program f...
  • HMSIWTV
  • HMSIWTV
  • 2012年10月18日 17:20
  • 10257

Winsock 2 入门指南

Winsock 2 入门指南 (翻译自MSDN+CBuilder2010文档) Translated by Xana Hopper Blog: http://blog.xanahopper.com...
  • q277055799
  • q277055799
  • 2014年02月19日 11:04
  • 5198

【C++】Winsock套接字编程,简单的socket通信代码(客户端、服务端)

上接前两章 操作系统:Windows10 开发环境:VS2015 服务端代码: // TCPserver.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" ...
  • shihoongbo
  • shihoongbo
  • 2016年07月14日 21:47
  • 3601

WinSock编程基础

在 UNIX 系统中,任何 I/O 操作都是通过读写文件描述符(File Descriptor)来实现的。网络通信 I/O 机制也是基于文件描述符来定义实现的。 鉴于 WinSock 1 是 WinS...
  • phunxm
  • phunxm
  • 2009年12月27日 14:30
  • 54495

Windows网络编程学习笔记(1) 编写一个Winsock基本框架

学习Winsock编程时的学习笔记,本章将介绍Winsock基本框架,Winsock 的作用,Winsock的环境设置, WSADATA结构体,不同平台下的Winsock版本,最基本的Winsock框...
  • Raito__
  • Raito__
  • 2016年05月10日 18:45
  • 2046

winsock 函数详解

  • 2009年04月19日 19:23
  • 19KB
  • 下载

Winsock简介

Winsock有两个主要的版本,Winsock1和Winsock2。Winsock2对Winsock1的基础上进行了更新或添加新的API函数,用函数名前的WSA前缀来区分版本。开发新应用程序请使用Wi...
  • luozenghui529480823
  • luozenghui529480823
  • 2013年10月25日 23:09
  • 2712
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用WinSock实现HTTP的GET
举报原因:
原因补充:

(最多只允许输入30个字)