其实原理就是从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;
}