⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 s_client.c

📁 mediastreamer2是开源的网络传输媒体流的库
💻 C
📖 第 1 页 / 共 3 页
字号:
		else if (strcmp(*argv,"-timeout") == 0)			enable_timeouts=1;		else if (strcmp(*argv,"-mtu") == 0)			{			if (--argc < 1) goto bad;			mtu = atol(*(++argv));			}#endif		else if (strcmp(*argv,"-bugs") == 0)			bugs=1;		else if	(strcmp(*argv,"-keyform") == 0)			{			if (--argc < 1) goto bad;			key_format = str2fmt(*(++argv));			}		else if	(strcmp(*argv,"-pass") == 0)			{			if (--argc < 1) goto bad;			passarg = *(++argv);			}		else if	(strcmp(*argv,"-key") == 0)			{			if (--argc < 1) goto bad;			key_file= *(++argv);			}		else if	(strcmp(*argv,"-reconnect") == 0)			{			reconnect=5;			}		else if	(strcmp(*argv,"-CApath") == 0)			{			if (--argc < 1) goto bad;			CApath= *(++argv);			}		else if	(strcmp(*argv,"-CAfile") == 0)			{			if (--argc < 1) goto bad;			CAfile= *(++argv);			}		else if (strcmp(*argv,"-no_tls1") == 0)			off|=SSL_OP_NO_TLSv1;		else if (strcmp(*argv,"-no_ssl3") == 0)			off|=SSL_OP_NO_SSLv3;		else if (strcmp(*argv,"-no_ssl2") == 0)			off|=SSL_OP_NO_SSLv2;		else if (strcmp(*argv,"-serverpref") == 0)			off|=SSL_OP_CIPHER_SERVER_PREFERENCE;		else if	(strcmp(*argv,"-cipher") == 0)			{			if (--argc < 1) goto bad;			cipher= *(++argv);			}#ifdef FIONBIO		else if (strcmp(*argv,"-nbio") == 0)			{ c_nbio=1; }#endif		else if	(strcmp(*argv,"-starttls") == 0)			{			if (--argc < 1) goto bad;			++argv;			if (strcmp(*argv,"smtp") == 0)				starttls_proto = 1;			else if (strcmp(*argv,"pop3") == 0)				starttls_proto = 2;			else				goto bad;			}#ifndef OPENSSL_NO_ENGINE		else if	(strcmp(*argv,"-engine") == 0)			{			if (--argc < 1) goto bad;			engine_id = *(++argv);			}#endif		else if (strcmp(*argv,"-rand") == 0)			{			if (--argc < 1) goto bad;			inrand= *(++argv);			}		else			{			BIO_printf(bio_err,"unknown option %s\n",*argv);			badop=1;			break;			}		argc--;		argv++;		}	if (badop)		{bad:		sc_usage();		goto end;		}	OpenSSL_add_ssl_algorithms();	SSL_load_error_strings();#ifndef OPENSSL_NO_ENGINE        e = setup_engine(bio_err, engine_id, 1);#endif	if (!app_passwd(bio_err, passarg, NULL, &pass, NULL))		{		BIO_printf(bio_err, "Error getting password\n");		goto end;		}	if (key_file == NULL)		key_file = cert_file;	if (key_file)		{		key = load_key(bio_err, key_file, key_format, 0, pass, e,			       "client certificate private key file");		if (!key)			{			ERR_print_errors(bio_err);			goto end;			}		}	if (cert_file)		{		cert = load_cert(bio_err,cert_file,cert_format,				NULL, e, "client certificate file");		if (!cert)			{			ERR_print_errors(bio_err);			goto end;			}		}	if (!app_RAND_load_file(NULL, bio_err, 1) && inrand == NULL		&& !RAND_status())		{		BIO_printf(bio_err,"warning, not much extra random data, consider using the -rand option\n");		}	if (inrand != NULL)		BIO_printf(bio_err,"%ld semi-random bytes loaded\n",			app_RAND_load_files(inrand));	if (bio_c_out == NULL)		{		if (c_quiet && !c_debug && !c_msg)			{			bio_c_out=BIO_new(BIO_s_null());			}		else			{			if (bio_c_out == NULL)				bio_c_out=BIO_new_fp(stdout,BIO_NOCLOSE);			}		}	ctx=SSL_CTX_new(meth);	if (ctx == NULL)		{		ERR_print_errors(bio_err);		goto end;		}	if (bugs)		SSL_CTX_set_options(ctx,SSL_OP_ALL|off);	else		SSL_CTX_set_options(ctx,off);	/* DTLS: partial reads end up discarding unread UDP bytes :-( 	 * Setting read ahead solves this problem.	 */	if (sock_type == SOCK_DGRAM) SSL_CTX_set_read_ahead(ctx, 1);	if (state) SSL_CTX_set_info_callback(ctx,apps_ssl_info_callback);	if (cipher != NULL)		if(!SSL_CTX_set_cipher_list(ctx,cipher)) {		BIO_printf(bio_err,"error setting cipher list\n");		ERR_print_errors(bio_err);		goto end;	}#if 0	else		SSL_CTX_set_cipher_list(ctx,getenv("SSL_CIPHER"));#endif	SSL_CTX_set_verify(ctx,verify,verify_callback);	if (!set_cert_key_stuff(ctx,cert,key))		goto end;	if ((!SSL_CTX_load_verify_locations(ctx,CAfile,CApath)) ||		(!SSL_CTX_set_default_verify_paths(ctx)))		{		/* BIO_printf(bio_err,"error setting default verify locations\n"); */		ERR_print_errors(bio_err);		/* goto end; */		}	store = SSL_CTX_get_cert_store(ctx);	X509_STORE_set_flags(store, vflags);	con=SSL_new(ctx);#ifndef OPENSSL_NO_KRB5	if (con  &&  (con->kssl_ctx = kssl_ctx_new()) != NULL)                {                kssl_ctx_setstring(con->kssl_ctx, KSSL_SERVER, host);		}#endif	/* OPENSSL_NO_KRB5  *//*	SSL_set_cipher_list(con,"RC4-MD5"); */re_start:	if (init_client(&s,host,port,sock_type) == 0)		{		BIO_printf(bio_err,"connect:errno=%d\n",get_last_socket_error());		SHUTDOWN(s);		goto end;		}	BIO_printf(bio_c_out,"CONNECTED(%08X)\n",s);#ifdef FIONBIO	if (c_nbio)		{		unsigned long l=1;		BIO_printf(bio_c_out,"turning on non blocking io\n");		if (BIO_socket_ioctl(s,FIONBIO,&l) < 0)			{			ERR_print_errors(bio_err);			goto end;			}		}#endif                                              	if (c_Pause & 0x01) con->debug=1;	if ( SSL_version(con) == DTLS1_VERSION)		{		struct timeval timeout;		sbio=BIO_new_dgram(s,BIO_NOCLOSE);		if (getsockname(s, &peer, (void *)&peerlen) < 0)			{			BIO_printf(bio_err, "getsockname:errno=%d\n",				get_last_socket_error());			SHUTDOWN(s);			goto end;			}		BIO_ctrl_set_connected(sbio, 1, &peer);		if ( enable_timeouts)			{			timeout.tv_sec = 0;			timeout.tv_usec = DGRAM_RCV_TIMEOUT;			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_RECV_TIMEOUT, 0, &timeout);						timeout.tv_sec = 0;			timeout.tv_usec = DGRAM_SND_TIMEOUT;			BIO_ctrl(sbio, BIO_CTRL_DGRAM_SET_SEND_TIMEOUT, 0, &timeout);			}		if ( mtu > 0)			{			SSL_set_options(con, SSL_OP_NO_QUERY_MTU);			SSL_set_mtu(con, mtu);			}		else			/* want to do MTU discovery */			BIO_ctrl(sbio, BIO_CTRL_DGRAM_MTU_DISCOVER, 0, NULL);		}	else		sbio=BIO_new_socket(s,BIO_NOCLOSE);	if (nbio_test)		{		BIO *test;		test=BIO_new(BIO_f_nbio_test());		sbio=BIO_push(test,sbio);		}	if (c_debug)		{		con->debug=1;		BIO_set_callback(sbio,bio_dump_callback);		BIO_set_callback_arg(sbio,bio_c_out);		}	if (c_msg)		{		SSL_set_msg_callback(con, msg_cb);		SSL_set_msg_callback_arg(con, bio_c_out);		}	SSL_set_bio(con,sbio,sbio);	SSL_set_connect_state(con);	/* ok, lets connect */	width=SSL_get_fd(con)+1;	read_tty=1;	write_tty=0;	tty_on=0;	read_ssl=1;	write_ssl=1;		cbuf_len=0;	cbuf_off=0;	sbuf_len=0;	sbuf_off=0;	/* This is an ugly hack that does a lot of assumptions */	if (starttls_proto == 1)		{		BIO_read(sbio,mbuf,BUFSIZZ);		BIO_printf(sbio,"STARTTLS\r\n");		BIO_read(sbio,sbuf,BUFSIZZ);		}	if (starttls_proto == 2)		{		BIO_read(sbio,mbuf,BUFSIZZ);		BIO_printf(sbio,"STLS\r\n");		BIO_read(sbio,sbuf,BUFSIZZ);		}	for (;;)		{		FD_ZERO(&readfds);		FD_ZERO(&writefds);		if (SSL_in_init(con) && !SSL_total_renegotiations(con))			{			in_init=1;			tty_on=0;			}		else			{			tty_on=1;			if (in_init)				{				in_init=0;				print_stuff(bio_c_out,con,full_log);				if (full_log > 0) full_log--;				if (starttls_proto)					{					BIO_printf(bio_err,"%s",mbuf);					/* We don't need to know any more */					starttls_proto = 0;					}				if (reconnect)					{					reconnect--;					BIO_printf(bio_c_out,"drop connection and then reconnect\n");					SSL_shutdown(con);					SSL_set_connect_state(con);					SHUTDOWN(SSL_get_fd(con));					goto re_start;					}				}			}		ssl_pending = read_ssl && SSL_pending(con);		if (!ssl_pending)			{#if !defined(OPENSSL_SYS_WINDOWS) && !defined(OPENSSL_SYS_MSDOS) && !defined(OPENSSL_SYS_NETWARE)			if (tty_on)				{				if (read_tty)  FD_SET(fileno(stdin),&readfds);				if (write_tty) FD_SET(fileno(stdout),&writefds);				}			if (read_ssl)				FD_SET(SSL_get_fd(con),&readfds);			if (write_ssl)				FD_SET(SSL_get_fd(con),&writefds);#else			if(!tty_on || !write_tty) {				if (read_ssl)					FD_SET(SSL_get_fd(con),&readfds);				if (write_ssl)					FD_SET(SSL_get_fd(con),&writefds);			}#endif/*			printf("mode tty(%d %d%d) ssl(%d%d)\n",				tty_on,read_tty,write_tty,read_ssl,write_ssl);*/			/* Note: under VMS with SOCKETSHR the second parameter			 * is currently of type (int *) whereas under other			 * systems it is (void *) if you don't have a cast it			 * will choke the compiler: if you do have a cast then			 * you can either go for (int *) or (void *).			 */#if defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_MSDOS)                        /* Under Windows/DOS we make the assumption that we can			 * always write to the tty: therefore if we need to			 * write to the tty we just fall through. Otherwise			 * we timeout the select every second and see if there			 * are any keypresses. Note: this is a hack, in a proper			 * Windows application we wouldn't do this.			 */			i=0;			if(!write_tty) {				if(read_tty) {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -