安全基地's Archiver

逃学书童 发表于 2007-4-21 20:21

[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]

越ヅ〃心伍 发表于 2007-4-21 20:24

恩,不错啊,顶一个 :victory:

恶魔之子 发表于 2007-4-21 20:57

不错不错 帖子好极了

wushuizhibing 发表于 2007-4-26 21:18

研究研究:victory:

小肥侠 发表于 2007-4-27 02:04

你自己做的吗?

小肥侠 发表于 2007-4-27 02:05

保存为什么格式呢?

colly109 发表于 2007-7-9 20:58

真的吗
LZ能不能再说详细点
我有点不太明白

shilong8663 发表于 2007-7-18 13:18

ding~~~~~~~~~

zcy99pksrh 发表于 2007-10-24 21:07

顶个...........
     谢谢LZ

BCBFANS 发表于 2008-11-29 09:05

??????????

页: [1]

Powered by 安全基地 Archiver 6.1.0  © 2001-2007 本SEO插件由网络人站长论坛出品