当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 9 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2009-05-30 21:51 

注册: 2007-05-11 22:52
帖子: 50
地址: 四川大学
送出感谢: 0 次
接收感谢: 0 次
改了下,应该可以了。
其实原理就是从cctv的网站上下载html文本然后解析出来,这次用了自动机,应该没问题了

代码:
/*
  Linux下cctv5直播表。
    文件:cctv5.c   编译:gcc cctv5.c -o cctv5
    运行:./cctv5 20090603
    注意:参数必须是以上格式,如20091010,没太多的错误检测,使用小心!
 */

#include <stdio.h>
#include <unistd.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <libintl.h>
#include <iconv.h>

#define TAIL ".shtml HTTP/1.1\r\nHOST:tv.cctv.com\r\nUser-Agent:Mozilla/4.0\r\n\r\n"

static char items[1000], res[1000];
static int sockfd, line = 1;
const char am_i[] = { 201, 207, 206, 231, 189, 218, 196, 191, 0 };
const char pm_i[] = { 207, 194, 206, 231, 189, 218, 196, 191, 0 };

int create_tcp_socket ( const char *addr, unsigned short port_num,
                        int *fd )
{
    int len, result;
    struct sockaddr_in address;
    struct hostent *hostinfo;
    hostinfo = gethostbyname ( addr );
    if ( !hostinfo )
        return -1;
    address.sin_family = AF_INET;
    address.sin_addr = *( struct in_addr * ) *hostinfo->h_addr_list;
    address.sin_port = htons ( port_num );
    *fd = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( connect
         ( *fd, ( struct sockaddr * ) &address,
           sizeof ( address ) ) == -1 )
        return -1;
    return 0;
}

static void gbk2utf8 (  )
{
    char *inbuf, *outbuf;
    iconv_t iconvd;
    int l1, l2;

    outbuf = &res;
    inbuf = &items;
    l1 = l2 = 1000;

    iconvd = iconv_open ( "utf-8", "gbk" );
    iconv ( iconvd, &inbuf, &l1, &outbuf, &l2 );
    iconv_close ( iconvd );
}

static void parse_line (  )
{
    int i, l1, l2;
    char ch;
    char *inbuf, *outbuf;
    iconv_t iconvd;
    i = strlen ( items );

    do
    {
        read ( sockfd, ( char * ) &ch, 1 );
        if ( ch == '<' )
        {
            if ( i > 0 && items[i - 1] != '\n' )
            {
                items[i] = '\n';
                ++i;
            }
            while ( ch != '>' )
                read ( sockfd, ( char * ) &ch, 1 );
        }
        else
        {
            items[i] = ch;
            ++i;
        }
    } while ( ch != '\n' );
    items[i] = 0;
}

static void parse_am (  )
{
    int i;
    char ch;
   
    i = 0;
    while ( read ( sockfd, ( char * ) &ch, 1 ) > 0 )
    {
        if ( ch == am_i[i] )
        {
            ++i;
            if ( i == 8 )
                break;
        }
        else
            i = 0;
    }

    items[0] = 0;
    strcat ( items, am_i );

    parse_line (  );

    gbk2utf8 (  );
}

static void parse_pm (  )
{
    int i;
    char ch;

    i = 0;
    while ( read ( sockfd, ( char * ) &ch, 1 ) > 0 )
    {
        if ( ch == pm_i[i] )
        {
            ++i;
            if ( i == 8 )
                break;
        }
        else
            i = 0;
    }

    int j = 2;
    while ( j )
    {
        read ( sockfd, ( char * ) &ch, 1 );
        if ( ch == 10 )
            j--;
    }

    items[0] = 0;
    strcat ( items, pm_i );
    strcat ( items, "(12:00-24:00)" );

    parse_line (  );

    gbk2utf8 (  );
}

int main ( int argc, char **argv )
{
    char t[100] = { "GET /soushi/28/07/" };
    int i;
    char ch;

    if ( create_tcp_socket ( "tv.cctv.com", 80, &sockfd ) < 0 )
    {
        fprintf ( stderr, "Create socket error\n" );
        return 1;
    }

    strcat ( t, argv[1] );
    strcat ( t, TAIL );
    write ( sockfd, t, strlen ( t ) );

    parse_am (  );
    printf ( "%s\n", res );
    parse_pm (  );
    printf ( "%s\n", res );

    close ( sockfd );

    return 0;
}



最后由 scu_guzo 编辑于 2009-06-21 14:50,总共编辑了 2 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2009-05-30 22:51 
头像

注册: 2009-05-29 10:15
帖子: 14
送出感谢: 0 次
接收感谢: 0 次
C语言写的啊


_________________
Java资深技术顾问,在线QQ:22550450


页首
 用户资料  
 
3 楼 
 文章标题 : Re: [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2009-06-01 10:53 

注册: 2008-04-28 10:57
帖子: 16
送出感谢: 0 次
接收感谢: 0 次
环境: gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
编译除了一些警告,通过。但运行出错。

~/workspace/c_c++$ ./cctv5 20090603
段错误


页首
 用户资料  
 
4 楼 
 文章标题 : Re: [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2009-06-21 14:49 

注册: 2007-05-11 22:52
帖子: 50
地址: 四川大学
送出感谢: 0 次
接收感谢: 0 次
大家再试试哈 :em01


页首
 用户资料  
 
5 楼 
 文章标题 : Re: [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2009-07-19 22:13 

注册: 2009-03-27 22:39
帖子: 248
送出感谢: 0 次
接收感谢: 0 次
:em11


页首
 用户资料  
 
6 楼 
 文章标题 : Re: [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2009-08-22 10:59 
头像

注册: 2009-08-21 18:06
帖子: 7
地址: 湖南科技大学
送出感谢: 0 次
接收感谢: 0 次
编译有些警告,测试通过。 收藏了。 改天好好看看~!

最近才开始LINUX下C,呵呵。 搂主要是牛人,可要带俺一把阿~呵呵~!

:em06


_________________
Please call me E. I'm glad to make friends with you!

http://blog.csdn.net/nchacker/ - http://hi.baidu.com/caieezone/ - http://renren.com/profile.do?id=232600803


页首
 用户资料  
 
7 楼 
 文章标题 : Re: [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2009-10-01 20:46 
头像

注册: 2009-06-11 13:37
帖子: 271
送出感谢: 1
接收感谢: 0 次
xjzhou 写道:
环境: gcc (Ubuntu 4.3.3-5ubuntu4) 4.3.3
编译除了一些警告,通过。但运行出错。

~/workspace/c_c++$ ./cctv5 20090603
段错误


# gcc cctv.c -o cctv
cctv.c: 在函数‘gbk2utf8’中:
cctv.c:49: 警告: 从不兼容的指针类型赋值
cctv.c:50: 警告: 从不兼容的指针类型赋值
cctv.c:54: 警告: 传递‘iconv’的第 3 个参数时在不兼容的指针类型间转换
cctv.c:54: 警告: 传递‘iconv’的第 5 个参数时在不兼容的指针类型间转换
cctv.c: 在函数‘parse_line’中:
cctv.c:64: 警告: 隐式声明与内建函数‘strlen’不兼容
cctv.c: 在函数‘parse_am’中:
cctv.c:107: 警告: 隐式声明与内建函数‘strcat’不兼容
cctv.c: 在函数‘parse_pm’中:
cctv.c:141: 警告: 隐式声明与内建函数‘strcat’不兼容
cctv.c: 在函数‘main’中:
cctv.c:161: 警告: 隐式声明与内建函数‘strcat’不兼容
cctv.c:163: 警告: 隐式声明与内建函数‘strlen’不兼容


_________________
跑debian应该是有点搞头的吧。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2010-01-09 19:00 
头像

注册: 2009-09-20 19:30
帖子: 765
地址: GIS
系统: ubuntu12.04
送出感谢: 0 次
接收感谢: 0 次
看来是个编程牛人啊。。。 :em09


页首
 用户资料  
 
9 楼 
 文章标题 : Re: [原创]linux下cctv5直播表(大家多多支持哈)
帖子发表于 : 2010-01-09 19:12 
头像

注册: 2009-10-08 11:15
帖子: 8430
地址: 大城市铁岭
送出感谢: 0 次
接收感谢: 9
MARK


_________________
我们是命运的妓女,它把我们都嫖了

N卡驱动:http://www.nvidia.cn/Download/index.aspx?lang=cn
极品飞车:http://www.geforce.cn/optimize/optimal-game-settings/need-for-speed-shift-geforce-gts-450-ops
孤岛危机优化设置:http://www.geforce.cn/optimize/optimal-game-settings/crysis-geforce-gtx-450-ops
:cp /etc/skel/.bashrc ~/
PS1="\[\e]2;\u@\H \w\a\e[32;1m\]\T$\[\e[0m\] "
http://cdimage.ubuntu.com/
http://releases.ubuntu.com/


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 9 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译