winsock重置(用WinSock实现HTTP的GET Unicorn 博客频道 CSDN.NET)
分类:
VC++学习
C/C++学习点滴
2007-10-06 15:53 546人阅读 评论(0) 收藏 举报以前用WinInet的类写过网络爬虫,所以也想自己试着直接用socket来写一个类似程序,看了很多的例程以及文章,自己用WinSock写了一个http下get功能的程序,比较精简,基本体现了这类程序的框架,发现重点还是要了解好http协议的头部,准备进一步学习RFC文档,网上对于http协议的介绍都貌似比较简略。
--2007--10--6--by wangben--hit--程序是vc下的一个Windows console的工程:
#include
#include
#include
#include
void SendString(SOCKET sock,LPCSTR str)
{
send(sock,str,strlen(str),0);
}int main(void)
{
WSADATAwsaData;
SOCKETsock;
SOCKADDR_INtcpaddr;
hostent *remoteHost;
char host[] = {"www.hao123.com"}; //主机名就直接写了
intRet,l;
BOOLdone;
intport = 80;
intchars = 0;
charbuffer[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;
}创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!