无聊,去腾讯股票打了个转。
Tofloor
poster avatar
hebinq
deepin
2018-01-03 20:05
Author



还有代码:
/********************************************************
* gcc -lpthread -o curl ./curl.c
*
* ./curl sh600133
*
* hebinq@qq.com
*
*
* *******************************************************/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define BUFSIZE 0xF000
//股票数据
typedef struct _GPDATA_SL{
    char dm[16];//代码
    char mc[16];//名字
    float jrkpj;//今日开盘价
    float zrspj;//昨日收盘价
    float zxj;//最新价
    float jrzjj;//今日最高价
    float jrzdj;//今日最低价
    float jmji;//竞买价
    float jmjo;//竞买价
    int cjgps;//成交的股数(股) 腾讯手
    double cjje;//成交金额(元) 腾讯万
    int mi_1;//买1股
    float mij_1;//买1价
    int mi_2;//买2股
    float mij_2;//买2价
    int mi_3;//买3股
    float mij_3;//买3价
    int mi_4;//买4股
    float mij_4;//买4价
    int mi_5;//买5股
    float mij_5;//买5价
    int mo_1;//卖1股
    float moj_1;//卖1价
    int mo_2;//卖2股
    float moj_2;//卖2价
    int mo_3;//卖3股
    float moj_3;//卖3价
    int mo_4;//卖4股
    float moj_4;//卖4价
    int mo_5;//卖5股
    float moj_5;//卖5价
    char rq[16];//日期
    char sj[16];//时间   
    int wp;//外盘
    int np;//内盘
    float zd;//涨跌
    float zf;//涨幅
    float hsl;//换手率
    float xyl;// 市盈率
    float sf;//振幅
    float ltsz;//流通市值
    float zsz;//总市值
    float szl;//市净率
    float ztj;//涨停价
    float dtj;//跌停价
    float lb;//量比
    float xylz;//市盈率(静)
}GPDATA_SL;



Reply Favorite View the author
All Replies
avatar
hebinq
deepin
2018-01-03 20:06
#1

/****************************************
* 功能:获取网页返回(socket)
* url:地址 不包含http://
*
* *************************************/
char* geturl(char* url)
{
     char *g_result = NULL;
    unsigned int g_buffersize = BUFSIZE;
        int cfd;
        struct sockaddr_in cadd;
        struct hostent *pURL = NULL;
        char myurl[BUFSIZE];
        char *pHost = 0;
        char host[BUFSIZE],GET[BUFSIZE];
        char request[BUFSIZE];
        static char text[BUFSIZE];
        int i,j;


        //分离主机中的主机地址和相对路径
        memset(myurl,0,BUFSIZE);
        memset(host,0,BUFSIZE);
        memset(GET,0,BUFSIZE);
        strcpy(myurl,url);
        for(pHost = myurl;*pHost != '/' && *pHost != '\0';++pHost);


        //获取相对路径保存到GET中
        if((int)(pHost-myurl) == strlen(myurl))
        {
                strcpy(GET,"/");//即url中没有给出相对路径,需要自己手动的在url尾部加上/
        }
        else
        {
                strcpy(GET,pHost);//地址段pHost到strlen(myurl)保存的是相对路径
        }

        //将主机信息保存到host中
        //此处将它置零,即它所指向的内容里面已经分离出了相对路径,剩下的为host信
//息(从myurl到pHost地址段存放的是HOST)
        *pHost = '\0';
        strcpy(host,myurl);
        //设置socket参数
        if(-1 == (cfd = socket(AF_INET,SOCK_STREAM,0)))
        {
                printf("create socket failed of client!\n");
                return NULL;
        }

        pURL = gethostbyname(host);//将上面获得的主机信息通过域名解析函数获得域>名信息

        //设置IP地址结构
        bzero(&cadd,sizeof(struct sockaddr_in));
        cadd.sin_family = AF_INET;
        cadd.sin_addr.s_addr = *((unsigned long*)pURL->h_addr_list[0]);
        cadd.sin_port = htons(80);
        //向WEB服务器发送URL信息
        memset(request,0,BUFSIZE);
        strcat(request,"GET ");
        strcat(request,GET);
        strcat(request," HTTP/1.1\r\n");//至此为http请求行的信息
        strcat(request,"HOST: ");
        strcat(request,host);
        strcat(request,"\r\n");
        strcat(request,"Cache-Control: no-cache\r\n\r\n");
        //连接服务器


        int cc;
        if(-1 == (cc = connect(cfd,(struct sockaddr*)&cadd,(socklen_t)sizeof(cadd))))
        {
                printf("connect failed of client!\n");
                return NULL;
        }
        //printf("connect success!\n");

        //向服务器发送url请求的request
        int cs;
        if(-1 == (cs = send(cfd,request,strlen(request),0)))
        {
                printf("向服务器发送请求的request失败!\n");
                return NULL;
        }
        //printf("发送成功,发送的字节数:%d\n",cs);

        //客户端接收服务器的返回信息
        int cr=1;
        
        //空间准备
        if (g_result)
        {
            free(g_result);
        }
        g_result = (char*)malloc(BUFSIZE);
        g_buffersize = BUFSIZE;
        memset(g_result, 0, g_buffersize);

        while(cr)
        {
            memset(text,0,BUFSIZE);
            int buflen = recv(cfd, text, BUFSIZE, 0);
            //printf("接收recv()->return:%d;字节数:%d\n",buflen,strlen(text));
            
            if(buflen < 0)
            {
            // 由于是非阻塞的模式,所以当buflen为EAGAIN时,表示当前缓冲区已无数据可读
            // 在这里就当作是该次事件已处理

            //如果协议在传送s的发送缓冲中的数据时出现网络错误,那么recv函数返回SOCKET_ERROR
            //recv函数返回其实际copy的字节数。如果recv在copy时出错,那么它返回SOCKET_ERROR;如果recv函数在等待协议接收数据时网络中断了,那么它返回0
            if(buflen == EAGAIN)
                break;
            else
                return NULL;
            }
            else if(buflen == 0)
            {
            // 这里表示对端的socket已正常关闭.
                break;
            }
            if(buflen != strlen(text))
                cr = 0;
            else
                cr = 1;// 需要再次读取

            //写入结果
            size_t left = g_buffersize  - strlen(g_result);
                    size_t size = strlen(text);
                    if (left < size) {
                        g_result = (char*)realloc(g_result, g_buffersize + BUFSIZE);
                        if (g_result)
                            g_buffersize += BUFSIZE;
                        else {
                            printf("mem alloc failed\n");
                            return NULL;
                        }
                    }
                    strncat(g_result, text, size);

                    break;//读取一次就可以啦。。。
        }

        close(cfd);
        return g_result;
}
Reply View the author
avatar
hebinq
deepin
2018-01-03 20:06
#2

/*******************************************
  * 功能:是否数值串
  * str:字符串
  * 返回:TRUE数值串
  ****************************************/
int isdigit_str(const char* str)
{
     char *p;
     int f=0;
     int d=0;
     int i=0;
     if(str!=NULL)
     if(strlen(str)>0)
     {
         p=str;
         if(*p=='-')
         {
             f++;
             ++p;
         }
     for(;*p!='\0';p++)
     {
         if(isdigit(*p))
            i++;
        else if(*p=='-')
            f+=2;
            else if(*p=='.')
            d++;
            else
            {
                i=0;
                break;
            }
     }
     if(f>1)
     i=0;
     else  if(d>1)
     i=0;
     else {
         i=i+f+d;
     }
     }
     return i;

}
Reply View the author
avatar
hebinq
deepin
2018-01-03 20:08
#3

/*******************************************
  * 功能:解码股票实时数据
  * str:url返回文本
  ******************************************/
GPDATA_SL* get_gpdatal_gtimg(const char* str)
{

        char  tmpstr[32];
        char* ret=NULL;
        size_t dl=sizeof(GPDATA_SL);
        GPDATA_SL *data=(GPDATA_SL*)malloc(dl);     
        memset(data,0,dl);   
        ret=strstr(str,"v_");         
        if(ret!=NULL)
        {   
              

            char* dm=ret;
            for(dm=ret;!isdigit(*dm);++dm);
            strncpy(data->dm,dm,6);
            printf("\n\n代码:%s\t",data->dm);
            //代码end
            char* var=NULL;
            for(var=dm;*var!='\"'&&*var!='\0';++var);
            
             char delims[] = "~";
            char *result = NULL;
            result = strtok( var, delims );
            int i=0;
            while( result != NULL ) {
               
                switch(i)
                {
                    case 0:break;
                    case 1:{
                        //名称                    
                    size_t insize=sizeof(result);
                    size_t avail=sizeof(data->mc);                    
                    char *inbuf=result;
                    char *outbuf=data->mc;
                    iconv_t convGBK = iconv_open("utf-8", "gb18030");
                    iconv(convGBK, &inbuf, &insize, &outbuf, &avail);
                    iconv_close(convGBK);
                    printf("名称:%s\t",data->mc);
                    }break;
                    case 2:{
                        
                        
                    }break;
                    case 3:{
                        //最新价                       
                        memset(tmpstr,0,strlen(tmpstr));
                        strncpy(tmpstr,result,strlen(result));
                        if(isdigit_str(tmpstr)){
                        data->zxj=atof(tmpstr);
                        printf("最新价:%.2f\t",data->zxj);
                        }
                    }break;
                    case 4:{
                        //昨日收盘价         
                        if(isdigit_str(result)){   
                        data->zrspj=atof(result);
                        printf("昨日收盘价:%.2f\t",data->zrspj);
                        }
                    }break;
                    case 5:{
                        //今日开盘价
if(isdigit_str(result)){   
            data->jrkpj=atof(result);
            printf("今日开盘价:%.2f\t",data->jrkpj);
}
                    }break;
                    case 6:{
                        //成交的股数(股)
if(isdigit_str(result)){   
            data->cjgps=atoi(result);
            printf("成交量(手):%d\t",data->cjgps);
}
                    }break;
                    case 7:{
                        //外盘
                        if(isdigit_str(result)){   
                        data->wp=atoi(result);
                        printf("外盘:%d\t",data->wp);
                        }
                    }break;
                    case 8:{
                        //内盘
                        if(isdigit_str(result)){   
                        data->np=atoi(result);
                        printf("内盘:%d\t",data->np);
                        }
                    }break;
                    case 9:{            
                        //买1价           
                        if(isdigit_str(result)){   
            data->mij_1=atof(result);
                        }
                    }break;
Reply View the author
avatar
hebinq
deepin
2018-01-03 20:08
#4
                   case 10:{
                                    //买1股        
                                    if(isdigit_str(result)){      
            data->mi_1=atoi(result);}
                    }break;
                    case 11:{
            //买2价
            if(isdigit_str(result)){   
            data->mij_2=atof(result);
            }
                    }break;
                    case 12:{
            //买2股
            if(isdigit_str(result)){   
            data->mi_2=atoi(result);
            }
                    }break;
                    case 14:{
            //买3股
            if(isdigit_str(result)){   
            data->mi_3=atoi(result);
            }
                    }break;
                    case 13:{
            //买3价
            if(isdigit_str(result)){   
              data->mij_3=atof(result);
            }
                    }break;
                    case 16:{
            //买4股
            if(isdigit_str(result)){   
            data->mi_4=atoi(result);
            }
                    }break;
                    case 15:{
            //买4价
            if(isdigit_str(result)){   
            data->mij_4=atof(result);
            }
                    }break;
                    case 18:{
            //买5股
            if(isdigit_str(result)){   
            data->mi_5=atoi(result);
            }
                    }break;
                    case 17:{
            //买5价
            if(isdigit_str(result)){   
            data->mij_5=atof(result);
            }
                    }break;



            //卖1股
            case 20:{ if(isdigit_str(result)) data->mo_1=atoi(result);};break;
            //卖1价
            case 19:{ if(isdigit_str(result)) data->moj_1=atof(result);};break;
            //卖2股
            case 22:{ if(isdigit_str(result)) data->mo_2=atoi(result);};break;
            //卖2价
            case 21:{ if(isdigit_str(result)) data->moj_2=atof(result);};break;
            //卖3股
            case 24:{  if(isdigit_str(result)) data->mo_3=atoi(result);};break;
            //卖3价
            case 23:{  if(isdigit_str(result)) data->moj_3=atof(result);};break;
            //卖4股
            case 26:{ if(isdigit_str(result)) data->mo_4=atoi(result);};break;
            //卖4价
            case 25:{ if(isdigit_str(result)) data->moj_4=atof(result);};break;
            //卖5股
            case 28:{ if(isdigit_str(result)) data->mo_5=atoi(result);};break;
            //卖5价
           case 27:{ if(isdigit_str(result)) data->moj_5=atof(result);};break;
           case 29:{
               
           }break;
           case 30:{
               //日期                     
            strncpy(data->rq,result,8);
            printf("日期:%s\t",data->rq);
            //时间                     
            char *p=result+8;
            strncpy(data->sj,p,strlen(result)-8);
            printf("时间:%s\t",data->sj);
           }break;
           case 31:{
               //涨跌
               if(isdigit_str(result)) {
               data->zd=atof(result);
               printf("涨跌:%.2f\t",data->zd);}
           }break;
           case 32:{
               //涨幅
               if(isdigit_str(result)) {
               data->zf=atof(result);
               printf("涨幅:%.2f\%\t",data->zf);
               }
               };break;
               case 33:{
                   //今日最高价
                   if(isdigit_str(result)) {
            data->jrzjj=atof(result);
            printf("今日最高价:%.2f\t",data->jrzjj);
                   }
               }break;
               case 34:{
            //今日最低价
            if(isdigit_str(result)) {
            data->jrzdj=atof(result);
            printf("今日最低价:%.2f\t",data->jrzdj);
            }
               };break;
               case 35:{
                    //价格/成交量(手)/成交额
                    
                    
               };break;
Reply View the author
avatar
hebinq
deepin
2018-01-03 20:09
#5
               case 36:{
                //成交的股数(股)
                if(isdigit_str(result)) {
                data->cjgps=atoi(result);
                printf("成交量(手):%d\t",data->cjgps);
                }
               }break;
               case 37:{
                   //成交额(万)
                   if(isdigit_str(result)) {
                   data->cjje=atof(result);
                printf("成交额(万):%.2f\t",data->cjje);
                   }
               }break;
               case 38:{
                    //换手率
                    if(isdigit_str(result)) {
                    data->hsl=atof(result);
                printf("换手率:%.2f\%\t",data->hsl);
                    }
               };break;
               case 39:{
                   // 市盈率
                   if(isdigit_str(result)) {
                    data->xyl=atof(result);
                    printf("市盈率(TTM):%.2f\t",data->xyl);
                   }
               }break;
               case 40:{
                  
               }break;
               case 41:{
                  
               }break;
               case 42:{
                   //振幅
                   if(isdigit_str(result)) {
                   data->sf=atof(result);
                    printf("振幅:%.2f\%\t",data->sf);
                   }
               }break;
               case 43:{
                   //流通市值
                   if(isdigit_str(result)) {
                    data->ltsz=atof(result);
                    printf("流通市值(亿):%.2f\t",data->ltsz);
                   }
               }break;
               case 44:{
                   //总市值
                   if(isdigit_str(result)) {
                   data->zsz=atof(result);
                    printf("总市值(亿):%.2f\t",data->zsz);
                   }
               }break;
               case 45:{
                   //市净率
                   if(isdigit_str(result)) {
                   data->szl=atof(result);
                    printf("市净率:%.2f\%\t",data->szl);
                   }
               }break;
               case 46:{
                   //涨停价
                   if(isdigit_str(result)) {
                   data->ztj=atof(result);
                    printf("涨停价:%.2f\t",data->ztj);
                   }
               }break;
               case 47:{
                   //跌停价
                   if(isdigit_str(result)) {
                   data->dtj=atof(result);
                    printf("跌停价:%.2f\t",data->dtj);
                   }
               }break;
               case 48:{
                   //量比
                   if(isdigit_str(result)) {
                   data->lb=atof(result);
                    printf("量比:%.2f\t",data->lb);
                   }
               }break;
               case 52:{
                   //市盈率(静)
                   if(isdigit_str(result)) {
                   data->xylz=atof(result);
                    printf("市盈率(静):%.2f\n",data->xylz);
                   }
               }


                    default:
                    //printf( "result is \"%s\"\n", result );
                    break;
                }
                result = strtok( NULL, delims );
                i++;
            }   
            


            //printf("%s\n",tmpstr);
           
            
        }
        return data;
}
Reply View the author
avatar
hebinq
deepin
2018-01-03 20:10
#6
void gp_pthread(const char* dm)
{
     char urlstr[256];
     const char *g_result;
     GPDATA_SL *gpl;
     memset(urlstr,0,256);
     //sprintf(urlstr,"hq.sinajs.cn/list=%s",dm);//新浪
     sprintf(urlstr,"qt.gtimg.cn/q=%s",dm);//腾讯
     
    while(1){
        g_result=geturl(urlstr);   
        //printf("%s\n",g_result);
        gpl=get_gpdatal_gtimg(g_result);        
        //printf("%s\n",gpl->dm);
        free(g_result);//回收内存
        free(gpl);//回收内存
        sleep(3);
        }

        
}
int main(int argc,char* argv[])
{
     pthread_t id;
     int ret;  
        if(argc<2)
        {
                printf("用法:%c 股票代码\n",argv[0]);
                exit(1);
        }
    ret=pthread_create(&id,NULL,(void *) gp_pthread,argv[1]);
    if(ret!=0){
    printf ("Create pthread error!\n");
    return 0;
    }   
    //pthread_join(id,NULL);//等待线程结束
    getchar();   
    return 0;
}
Reply View the author
avatar
zwq133
deepin
2018-01-03 21:11
#7
得有个漂亮的GUI才能被大众接受!
Reply View the author
avatar
186******39
deepin
2018-01-04 21:51
#8
求git,累死啦
Reply View the author