[C 源码]查询天气情况的C程序
[code]//查询天气情况的C程序#include
#include
#include
#include
#pragma comment(lib,"ws2_32.lib")
struct Weather_Info
{
char city[50];
char weather[50];
char temp[50];
char wind[50];
};
const char* URL="http://weather.tq121.com.cn/mapanel/index1.php?city=%s";
const char* weather_tag="";
const char* temp_tag="";
const char* wind_tag="";
bool GetWeather(Weather_Info&wi,char *html)
{
if(html==NULL)
return false;
char *temp=NULL;
if((temp=strstr(html,weather_tag))==NULL)
return false;
temp+=strlen(weather_tag);
memcpy(wi.weather,temp,strlen(temp)-strlen(strstr(temp,"<")));
if((temp=strstr(html,temp_tag))==NULL)
return false;
temp+=strlen(temp_tag);
memcpy(wi.temp,temp,strlen(temp)-strlen(strstr(temp,"<")));
if((temp=strstr(html,wind_tag))==NULL)
return false;
temp+=strlen(wind_tag);
memcpy(wi.wind,temp,strlen(temp)-strlen(strstr(temp,"<")));
return true;
}
bool 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;
}
struct SearchInfo //搜索结构体定义
{
char host[256]; //主机名
unsigned int port; //端口号
char filename[256]; //要文件名
char outfile[50]; //保存文件名
};
void GetUrls(char *html); //解析html代码中的URL
bool initsocket(); //初始化套接字
bool initargs(SearchInfo &outinfo,int argc,char **args); //解析输入命令行参数
const char *HTTP_STR="http://";
const char* HTTP_REQUEST_HEADER= //HTTP请求头
"GET %s HTTP/1.1\r\nAccept:*/*\r\nAccept-Language:zh-cn\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)\r\nHost:%s\r\n\r\n";
bool initargs(SearchInfo &outinfo,const char*city)
{
memset(&outinfo,0,sizeof(SearchInfo)); //初始化
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(outinfo.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(outinfo.host,temp,length); //解析出主机名
if((temp=strstr(outinfo.host,":"))!=NULL) //解析端口
{
temp++;
outinfo.port=atoi(temp);
}
else //如果没有输入使用默认80
{
outinfo.port=80;
}
delete temp;
return true;
}
char* GetFile(const SearchInfo * psi)
{
if(psi==NULL)
{
return NULL;
}
unsigned long serverip=0; //服务器IP
if((serverip=inet_addr(psi->host))==INADDR_NONE) //如果主机名不是IP
{
hostent *phst=gethostbyname(psi->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(psi->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),psi->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};
sprintf(buffer_sendmsg,HTTP_REQUEST_HEADER,psi->filename,psi->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;
}
void PrintWeather(const Weather_Info* pwi)
{
system("cls");
printf("\n");
printf("\n");
printf("\n");
printf(" \t 天气预报\n");
printf(" \t=====================================\n");
printf(" \t城 市:%s\n",pwi->city);
printf(" \t------------------------------------\n");
printf(" \t天 气:%s\n",pwi->weather);
printf(" \t------------------------------------\n");
printf(" \t温 度:%s\n",pwi->temp);
printf(" \t------------------------------------\n");
printf(" \t风 向:%s\n",pwi->wind);
printf(" \t======================================\n");
}
int main(int argc,char**argv)
{
Weather_Info wi;
SearchInfo si;
char cCityName[20];
memset(&wi,0,sizeof(Weather_Info));
printf("请输入你要查询的城市:");
scanf("%s",cCityName);
strcpy(wi.city,cCityName);
if(argc>=2)
strcpy(wi.city,argv[1]);
if(!initsocket())
{
printf("Socket Error~\n");
return 1;
}
memset(&si,0,sizeof(SearchInfo));
sprintf(si.host,URL,wi.city);
if(!initargs(si,wi.city))
{
printf("Connect Internet Error~\n");
return 1;
}
char *html=NULL;
if((html=GetFile(&si))==NULL)
{
printf("Get Information Error~!\n");
return 1;
}
if(!GetWeather(wi,html))
{
printf("Get Weather Info Error~\n");
return 1;
}
free(html);
PrintWeather(&wi);
system("pause");
return 0;
}[/code] 恩,不错啊,顶一个 :victory: 不错不错 帖子好极了 研究研究:victory: 你自己做的吗? 保存为什么格式呢? 真的吗
LZ能不能再说详细点
我有点不太明白 ding~~~~~~~~~ 顶个...........
谢谢LZ ??????????
页:
[1]
