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

📄 test.c

📁 开源的ssl算法openssl,版本0.9.8H
💻 C
字号:
/* test.c *//* $Id: test.c,v 1.1 2001/09/17 19:06:59 bodo Exp $ */#define L_PORT 9999#define C_PORT 443#include <arpa/inet.h>#include <assert.h>#include <errno.h>#include <fcntl.h>#include <netinet/in.h>#include <netinet/tcp.h>#include <stdlib.h>#include <stdio.h>#include <string.h>#include <sys/select.h>#include <sys/socket.h>#include <unistd.h>#include "test.h"#include "easy-tls.h"voidtest_process_init(int fd, int client_p, void *apparg){    fprintf(stderr, "test_process_init(fd = %d, client_p = %d, apparg = %p)\n", fd, client_p, apparg);}voidtest_errflush(int child_p, char *errbuf, size_t num, void *apparg){    fputs(errbuf, stderr);}intmain(int argc, char *argv[]){    int s, fd, r;    FILE *conn_in;    FILE *conn_out;    char buf[256];    SSL_CTX *ctx;    int client_p = 0;    int port;    int tls = 0;    char infobuf[TLS_INFO_SIZE + 1];    if (argc > 1 && argv[1][0] == '-') {	fputs("Usage: test [port]                   -- server\n"	      "       test num.num.num.num [port]   -- client\n",	      stderr);	exit(1);    }    if (argc > 1) {	if (strchr(argv[1], '.')) {	    client_p = 1;	}    }        fputs(client_p ? "Client\n" : "Server\n", stderr);        {	struct tls_create_ctx_args a = tls_create_ctx_defaultargs();	a.client_p = client_p;	a.certificate_file = "cert.pem";	a.key_file = "cert.pem";	a.ca_file = "cacerts.pem";		ctx = tls_create_ctx(a, NULL);	if (ctx == NULL)	    exit(1);    }        s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);    if (s == -1) {	perror("socket");	exit(1);    }        if (client_p) {	struct sockaddr_in addr;	size_t addr_len = sizeof addr;	    	addr.sin_family = AF_INET;	assert(argc > 1);	if (argc > 2)	    sscanf(argv[2], "%d", &port);	else	    port = C_PORT;	addr.sin_port = htons(port);	addr.sin_addr.s_addr = inet_addr(argv[1]);	    	r = connect(s, &addr, addr_len);	if (r != 0) {	    perror("connect");	    exit(1);	}	fd = s;	fprintf(stderr, "Connect (fd = %d).\n", fd);    } else {	/* server */	{	    int i = 1;	    r = setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void *) &i, sizeof i);	    if (r == -1) {		perror("setsockopt");		exit(1);	    }	}		{	    struct sockaddr_in addr;	    size_t addr_len = sizeof addr;	    	    if (argc > 1)		sscanf(argv[1], "%d", &port);	    else		port = L_PORT;	    addr.sin_family = AF_INET;	    addr.sin_port = htons(port);	    addr.sin_addr.s_addr = INADDR_ANY;	    	    r = bind(s, &addr, addr_len);	    if (r != 0) {		perror("bind");		exit(1);	    }	}    	r = listen(s, 1);	if (r == -1) {	    perror("listen");	    exit(1);	}	fprintf(stderr, "Listening at port %i.\n", port);		fd = accept(s, NULL, 0);	if (fd == -1) {	    perror("accept");	    exit(1);	}		fprintf(stderr, "Accept (fd = %d).\n", fd);    }    conn_in = fdopen(fd, "r");    if (conn_in == NULL) {	perror("fdopen");	exit(1);    }    conn_out = fdopen(fd, "w");    if (conn_out == NULL) {	perror("fdopen");	exit(1);    }    setvbuf(conn_in, NULL, _IOLBF, 256);    setvbuf(conn_out, NULL, _IOLBF, 256);	    while (fgets(buf, sizeof buf, stdin) != NULL) {	if (buf[0] == 'W') {	    fprintf(conn_out, "%.*s\r\n", (int)(strlen(buf + 1) - 1), buf + 1);	    fprintf(stderr, ">>> %.*s\n", (int)(strlen(buf + 1) - 1), buf + 1);	} else if (buf[0] == 'C') {	    fprintf(stderr, "Closing.\n");	    fclose(conn_in);	    fclose(conn_out);	    exit(0);	} else if (buf[0] == 'R') {	    int lines = 0;	    sscanf(buf + 1, "%d", &lines);	    do {		if (fgets(buf, sizeof buf, conn_in) == NULL) {		    if (ferror(conn_in)) {			fprintf(stderr, "ERROR\n");			exit(1);		    }		    fprintf(stderr, "CLOSED\n");		    return 0;		}		fprintf(stderr, "<<< %s", buf);	    } while (--lines > 0);	} else if (buf[0] == 'T') {	    int infofd;	    tls++;	    {		struct tls_start_proxy_args a = tls_start_proxy_defaultargs();		a.fd = fd;		a.client_p = client_p;		a.ctx = ctx;		a.infofd = &infofd;		r = tls_start_proxy(a, NULL);	    }	    assert(r != 1);	    if (r != 0) {		fprintf(stderr, "tls_start_proxy failed: %d\n", r);		switch (r) {		case -1:		    fputs("socketpair", stderr); break;		case 2:		    fputs("FD_SETSIZE exceeded", stderr); break;		case -3:		    fputs("pipe", stderr); break;		case -4:		    fputs("fork", stderr); break;		case -5:		    fputs("dup2", stderr); break;		default:		    fputs("?", stderr);		}		if (r < 0)		    perror("");		else		    fputc('\n', stderr);		exit(1);	    }	    	    r = read(infofd, infobuf, sizeof infobuf - 1);	    if (r > 0) {		const char *info = infobuf;		const char *eol;				infobuf[r] = '\0';		while ((eol = strchr(info, '\n')) != NULL) {		    fprintf(stderr, "+++ `%.*s'\n", eol - info, info);		    info = eol+1;		}		close (infofd);	    }	} else {	    fprintf(stderr, "W...  write line to network\n"		    "R[n]  read line (n lines) from network\n"		    "C     close\n"		    "T     start %sTLS proxy\n", tls ? "another " : "");	}    }    return 0;}

⌨️ 快捷键说明

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