Exemplo n.º 1
0
static void print_usage(FILE *out, char *argv0, Command_Options *copts, int exit_value)
{

	fprintf(out, "Usage: %s [language|dictionary location]\n"
			 "                   [-<special \"!\" command>]\n"
			 "                   [--version]\n", fbasename(argv0));

	fprintf(out, "\nSpecial commands are:\n");
	if (stdout != out) divert_stdio(stdout, out);
	issue_special_command("var", copts, NULL);
	if (out == stdout) print_url_info(); /* don't print it for errors */
	exit(exit_value);
}
Exemplo n.º 2
0
/*
 *主函数
 */
int main( int argc, char ** argv )
{

        if( argc != 2 ) { /* 从键盘接收输入的线程数 */
                printf( "Usage: %s thread_num.\n", argv[0] );
                exit( 1 );
        }

        thread_num = atoi( argv[1] ); /* 把字符串转换为整数 */

        int sock_fd = socket( AF_INET, SOCK_STREAM, 0 );
        if( sock_fd == -1 ) {
                perror("socket");
                exit( 1 );
        }

        int ret;
        printf("Input URL: ");
        gets( url.url ); /* 从键盘输入要下载的文件的URL */
        ret = parse_path(); /* 解析输入的URL地址 */
        if( ret == -1 ) {
                printf("parse path error.\n");
                exit( 1 );
        }

	/* 1.连接到服务器 */
        int addr_len = ADDR_SIZE;
        ret = connect( sock_fd, ( sockaddr_t * )( &url.addr), addr_len );
        if( ret == -1 ) {
                perror("connect error");
                exit( 1 );
        }

        print_url_info(); /* 打印出URL信息 */

        char * request = malloc( 1000 );
        sprintf( request, "GET %s HTTP/1.1\r\nHost: %s:%d\r\n\r\n",
                url.file_path, inet_ntoa( url.addr.sin_addr ), PORT_NUM );

        printf("request: %s\n", request );

	/* 2.向服务器发送请求 */
        printf("send request ...\n");
        send( sock_fd, request, strlen(request)+1, 0 );

        fd = open( url.file_name, O_CREAT | O_TRUNC | O_WRONLY );
        if( fd == -1 ) {
                perror( "open");
                exit( 1 );
        }

        char recv_buf[1400];
        int data_length;

        printf("Receive data from %s ... \n", url.hostname );
        ret = do_head( sock_fd, recv_buf, &data_length );
        if( ret > 0 ) {
                write( fd, recv_buf, ret );
        }

        printf("File size: %d\n", data_length );
        char end = 0;
        lseek( fd, data_length -1 , SEEK_SET );
        write( fd, &end, 1 );

	/* 3.关闭套接口 */
        close( sock_fd );


        int i;
        seed_t seed[ thread_num ];
        pthread_t thread[ thread_num ];
        int per_thread_load_size = data_length / thread_num; /* 每一个线程需要下载的大小 */

	/* 4.创建线程开始下载 */
        for( i=0; i<thread_num; ++i ) {
                printf("Have creat %d threads\n", i );
                seed[i].start_position = per_thread_load_size * i;   /*  */
                if( i == ( thread_num - 1 ) )
                        seed[i].data_len = per_thread_load_size +
                                           data_length % thread_num;
                else
                        seed[i].data_len = per_thread_load_size;
                pthread_create( &thread[i], NULL, thread_load,
                                             &seed[i] );
        }


        for( i=0; i<thread_num; ++i )
                pthread_join( thread[i], NULL );

        close( fd );
        return 0;
}