⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 weather.cpp

📁 输入城市的名字就可以查询该城市的天气。非常强大的类。喜欢的就可以下载
💻 CPP
字号:
//=================================================================
//=================================================================
//
//文件: Weather.cpp
//
//作用:从网站上获取天气信息
//
//作者:Sinble  2008-09-23	QQ14375931
//=================================================================
//=================================================================

#include "stdafx.h"
#include "Weather.h"
#pragma comment(lib,"ws2_32.lib")
#include <Winsock2.h>

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CWeather::CWeather()
{
	m_URL=_T("http://weather.tq121.com.cn/mapanel/index1.php?city=%s");
	m_city = _T("广州");

	memset(&m_weatherInfo,0,sizeof(Weather_Info));
	strcpy(m_weatherInfo.city,m_city);
	memset(&m_searchInfo,0,sizeof(SearchInfo));
}

CWeather::~CWeather()
{

}

bool CWeather::initsocket()
{
	WORD wVersionRequested;
	WSADATA wsaData;
	int err;
	wVersionRequested = MAKEWORD( 2, 2 );
	err = WSAStartup( wVersionRequested, &wsaData );

	if ( err != 0 )
	{
		return false;
	}
 
	if (LOBYTE( wsaData.wVersion ) != 2 ||
			HIBYTE( wsaData.wVersion ) != 2)
	{
		WSACleanup();
		return false;
	}
	 return true;
}

bool CWeather::initargs(const char*city)
{
	memset(&m_searchInfo,0,sizeof(SearchInfo));//初始化
	
	const char* URL=(LPCTSTR)m_URL;//"http://weather.tq121.com.cn/mapanel/index1.php?city=%s";
	const char *HTTP_STR="http://";

	char *temp=new char[256];
	memset(temp,0,256);
	sprintf(temp,URL,city);
	printf(temp);
    temp=(strstr(temp,HTTP_STR)!=NULL)?temp+strlen(HTTP_STR):temp;//去掉前面的http:\\
  //  printf("Url:%s\n",temp);

	strcpy(m_searchInfo.filename,strstr(temp,"/")!=NULL?strstr(temp,"/"):"/");//分析出要下载文件名
    int length=strstr(temp,"/")==NULL?strlen(temp):(strlen(temp)-strlen(strstr(temp,"/")));

	//分析出主机名的长度www.zzti.edu.cn/index.html-/index.html
    memcpy(m_searchInfo.host,temp,length);//解析出主机名
	if((temp=strstr(m_searchInfo.host,":"))!=NULL)//解析端口
	{
		temp++;
		m_searchInfo.port=atoi(temp);
	}
	else//如果没有输入使用默认80
	{
		m_searchInfo.port=80;
	}
	delete temp;
	return true;
}


char* CWeather::GetFile()
{
	unsigned long serverip=0;//服务器IP
	if((serverip=inet_addr(m_searchInfo.host))==INADDR_NONE)//如果主机名不是IP
	{
		hostent *phst=gethostbyname(m_searchInfo.host);//用DNS解析主机IP
		if(phst==NULL)//如果解析失败返回false
			return NULL;
		//IN_ADDR in;
		if(phst->h_addr_list[0]!=0)//解析成功使用主机第一个IP
		{
			memcpy(&serverip,phst->h_addr_list[0],phst->h_length);
	//		in.S_un.S_addr=serverip;
		}
	//	printf("IP:%s",inet_ntoa(in));
	}
	SOCKET s=socket(AF_INET,SOCK_STREAM,0);//创建socket(TCP连接)
	if(s==INVALID_SOCKET)//创建失败
	{
		printf("Create socket Error!Error Code:%d\n",WSAGetLastError());
		return NULL;
	}
	SOCKADDR_IN server_addr;//服务器address
	server_addr.sin_addr.S_un.S_addr=serverip;
	server_addr.sin_family=AF_INET;
	server_addr.sin_port=htons(m_searchInfo.port);
	memset(server_addr.sin_zero,0,sizeof(server_addr.sin_zero));
    printf("Begin Connect Server :%s On:%d\n",inet_ntoa(server_addr.sin_addr),m_searchInfo.port);
	//开始连接服务器发出请求
    if(SOCKET_ERROR==connect(s,(const sockaddr*)&server_addr,sizeof(SOCKADDR_IN)))
	{
		printf("Connect Server Error!Error Code:%d\n",WSAGetLastError());
        closesocket(s);
		//如果连接失败
		return NULL;
	}
    printf("Connect Server OK!\n");
   char buffer_sendmsg[256]={0};
   const char* HTTP_REQUEST_HEADER= //HTTP请求头
"GET %s HTTP/1.1\r\nAccept:*/*\r\n\
Accept-Language:zh-cn\r\n\
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\n\
Host:%s\r\n\r\n";

   sprintf(buffer_sendmsg,HTTP_REQUEST_HEADER,m_searchInfo.filename,m_searchInfo.host);//构造HTTP请求
   //printf(buffer_sendmsg);
	if(send(s,buffer_sendmsg,256,0)==SOCKET_ERROR)//向服务器发送请求
	{
		printf("Send Request To Server Error!Error Code:%d\n",WSAGetLastError());
		
		closesocket(s);
		//发送失败
		return NULL;
	}
    //打开文件开始保存html代码

	int len=0;
	char buffer_recv[1024]={0};//接收html的buffer
    
    int sumlen=0;//html的长度
	char *html=(char*)malloc(sizeof(char)*1);//总的html字符串

	while((len=recv(s,buffer_recv,1024,0))!=0)
	{
		if(len==SOCKET_ERROR)
		{
			printf("Error in Recv Data!Error Code:%d\n",WSAGetLastError());
			closesocket(s);
		 
			return NULL;
		}
		sumlen=strlen(html);
	 	printf(buffer_recv);
		//重新分配内存原来大小加len长度
		if((html=(char*)realloc((void*)html,sumlen+sizeof(char)*len))!=NULL)
		{
			memset(html+sumlen-1,0,len);//将新分到内存初始为0
			strcat(html,buffer_recv);//将收到信息写入新分到内存
		}
      memset(buffer_recv,0,1024);
	}

	closesocket(s);
    closesocket(s);
 
    return strlen(html)==0?NULL:html;
}

bool CWeather::GetWeatherInfoFromHtml(char *html)
{
	const char* weather_tag="<td width=\"160\" align=\"center\" valign=\"top\" class=\"weather\">";
	const char* temp_tag="<td width=\"160\" align=\"center\" valign=\"top\" class=\"weatheren\">";
	const char* wind_tag="<td width=\"153\" valign=\"top\"><span class=\"big-cn\">";

 if(html==NULL)
	 return false;
 char *temp=NULL;
 if((temp=strstr(html,weather_tag))==NULL)
	 return false;
 
 temp+=strlen(weather_tag);
 memcpy(m_weatherInfo.weather,temp,strlen(temp)-strlen(strstr(temp,"<")));
  if((temp=strstr(html,temp_tag))==NULL)
	 return false;
 temp+=strlen(temp_tag);
 memcpy(m_weatherInfo.temp,temp,strlen(temp)-strlen(strstr(temp,"<")));
  if((temp=strstr(html,wind_tag))==NULL)
	 return false;
 temp+=strlen(wind_tag);
 memcpy(m_weatherInfo.wind,temp,strlen(temp)-strlen(strstr(temp,"<")));
 return true;
}

bool CWeather::StartGetWeather()
{
	if(!initsocket())
	{
		AfxMessageBox("初始化失败!");
		return false;
	}

	const char* city = (LPCTSTR)m_city;
	if(!initargs(city))
	{
		AfxMessageBox("连接失败!");
		return false;
	}
	
	char *html=NULL;

	html = GetFile();
	GetWeatherInfoFromHtml(html);

	free(html);

	m_temp = m_weatherInfo.temp;
	m_weather = m_weatherInfo.weather;
	m_wind = m_weatherInfo.wind;

	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -